When you're synchronizing from network, you're most likely limited by the rate of fetching blocks. When you're reindexing blocks that are already present on disk, only CPU is the bottleneck.
The algorithm to decide where and when to request blocks is relatively stupid, slow, and easy to confuse. This is why during synchronization from network, you rarely use all bandwidth available. This is being worked on, but it's not a simple problem, if you want to avoid many problematic edge cases. EDIT: bandwidth usage should be a lot better since Bitcoin Core v0.10.
When reindexing block on disk, the reference client will by default use all CPU cores available, to speed up the process. You can put par=1
in bitcoin.conf to restrict the validation operation to a single core. As of 0.9 (not yet released), you'll also be able to change this value in the GUI configuration.