The chain has to be rescanned to identify incoming transactions for each and every key. It would be completely normal for the client to freeze for quite a while if there are a large number of keys/addresses that need to be rescanned.
I was making a bunch of changes to the "importwallet" RPC command a few days back, including adding an optional "rescan" parameter, so the user can opt not to rescan after every import if he's doing a bunch of them.
I left all my wallets importing overnight, with no rescan, then wanted to run the rescan in the morning. I made a change to the code so it would only rescan the first 10,000 blocks of the chain, since that's where all the initial distribution happened, and I knew there were thousands of transactions in the chain for my imported addresses after that. I didn't need to see those transactions, I was only interested to see which imported addresses had free distribution CLAMs awarded to them. I was curious to know whether the import I did back in June had missed any.
So I rebuilt the client so it would only rescan the first 10k blocks and ran a rescan. It was pretty quick, and found 52 initial distribution transactions. All my wallets together had 52 funded addresses when the snapshot was taken. That was a nice surprise, because last time I checked, back in June, there were only 48 of them.
To my surprise, when I checked the balance of the wallet, it was around 18 CLAM. Somehow the wallet had figured out that I had already claimed the 48 addresses back in June, and only 4*4.6 CLAM were still available. It did that without rescanning the rest of the chain. I'm not sure how it did it, but it did. Maybe the transactions spending those 48 sets of 4.6 CLAMs were still hanging around in the wallet, although I thought -rescan was meant to clean out the transaction list and start from scratch. Maybe not. Maybe it just looks for new transactions and doesn't delete the old ones.
I forget what point I was trying to make. Probably that just rescanning the first 10k blocks is enough after importing a BTC wallet, because that's where the initial-distro magic happened. Maybe "importwallet" would be quicker if it only scanned those 10k blocks instead of the whole 340k block chain.