I think this was answered in an internal discussion, but for archival purposes:
See Leaver-Fay et al. Methods Enzymol (https://www.ncbi.nlm.nih.gov/pubmed/21187238) for broad scale details on how the Rosetta scorefunction works.
The key thing is that the Rama energy term isn’t responsible for iterating across the Pose in order to calculate the total score. Instead it’s the ScoreFunction object (in the operator() method) which is responsible for iterating through the residues in the Pose and calling the scorefunction on each.
This makes things easier because when you do protocols like packing, the Packer can cache the residue energies and residue pair energies, and reuse them if the residue doesn’t change. If all the scorefunction got was a lump sum for the entire protein, the energy terms would be doing a bunch of repeated work, recalculating scores for residues which didn’t really change.