In my opinion, the auxpow is not really necessary for the block index. This data structure is used, AFAIK, only to keep the basic "shape" of the block chain in memory. In particular, it seems that auxpow of class CBlockIndex is only every really used in CBlockIndex::GetBlockHeader, which in turn is only used for two things:
- CBlock::ReadFromDisk: If the transactions are not necessary, the block header is instead loaded from CBlockIndex instead of actually read from disk. Not sure when/how often this is the case, but in principle we could read the auxpow in this case when it is first needed instead of loading it for all block index blocks at start-up.
- Processing the "getheaders" network message. Presumably, it is necessary to send the auxpow to peers together with the block headers, so that they can verify the PoW and find the longest chain. Again, I'm not sure how common this will really be in practice -- and so, here we could also load the auxpow from the blocks themselves when necessary.