If the output value was only constrained by their sum being smaller than that of the inputs, you could e.g. set one output to a negative value and create new money in a second output. 

You can also do more creative stuff:
I think the rule might have been introduced as a response to the [value overflow incident](https://en.bitcoin.it/wiki/Value_overflow_incident) on 2010-08-15. A transaction in a (now invalid) block at height 74638 created outputs that were so large that their sum overflowed into the permitted range. The transaction created 2×92.2 billion bitcoins.

The code fix for the value overflow incident can be found in this [commit](https://github.com/bitcoin/bitcoin/commit/d4c6b90ca3f9b47adb1b2724a0c3514f80635c84#diff-118fcbaaba162ba17933c7893247df3aR1013). The code for this rule can be found in [src/consensus/tx_check.cpp](https://github.com/bitcoin/bitcoin/blob/c46f1ce75196860c8b036d2965faac7db3aa4414/src/consensus/tx_check.cpp#L30). The `CheckTransaction()` function checks consensus rules that don't require any knowledge of the current chainstate.