My estimate of non-zero-balance addresses was wrong, what's required is a summary of unspent transaction outputs, with is a superset of addresses. Still, serializing UxO into a summary will require a lot less space than the full blockchain, and should still be able to be defined in such a way that the actual summary block never needs to be passed around, except to be generated specifically to bootstrap a client.
There is a
thread discussing compressing this data. The idea is to have a merkle like tree that stores the data.
If you have the previous value and the list of transaction outputs from the current block (and some extra info about branches), you can prove that the tree was correctly updated.
If one of those was included in each block header, then double spending would be detectable without the whole chain.