Each header is 80 bytes and there are 385k of them. This gives around 30MB of data for the headers.
The header chain has to be downloaded in series. But once you have downloaded the 30MB header chain from one peer, your node has the headers for all the blocks that you need to download.
You can ask each peer for a different block. This is parallel just like bittorrent. Each peer sends you blocks and you can verify that they match the header. If a node takes to long to send you a block, then you disconnect from that node and ask a different node for the block.
Once they chain has been downloaded, your node then just downloads each new block from whichever node(s) notifies it about the block.
I used to think blockchain size was an immediate issue, but with the parallel sync and a 1gbps connection, it isnt and wont be for quite a while. The processing of it is almost all totally in parallel, so even as the blockchain increases in size the time for a full sync is very close to linear.
The cost is that the time to get account balances will grow linearly over time also, but it is always possible to create another layer of data on top of the raw data. Currently I directly create the data structures that can be used for all the account queries needed.
James