Whenever an output is spent, it is entirely spent. The remaining amount is returned to you at a new address in that transaction. Once a spent transaction is buried under enough blocks, it can be safely deleted, should your client choose to delete it.
A has 10 coins sitting at a certain output O1. To transfer 8 coins to B from that output, you create a transaction TX1 that references it (and thus entirely spends it) as input, and lists two new outputs : 8 coins to B and 2 coins back to A.
Then A decides to double spend, and creates TX2 where he references O1 again as input. To verify TX2 you still need to know if O1 was spent or not. How would you know that without going through all the historical blocks/transactions to find TX1, the transaction that spends it?