Most of the things that reach all the way into CTransaction::CTXOut::nValue should not be doing this. The methods that do this should not technically be directly interacting even with CTXOut, except for the ones that are in CTransaction.
Making nValue private will prevent more "bad" code from entering the client, and is the start of fixing this problem for good.
I have made a pull request but I think it was prematurely closed.