Kingsley, thank you for your reply.
I agree that it smells like a threading deadlock. However, Since I'm not doing any threading in this process, if it is a threading issue it must be internal to the ArcObject calls. I know that it's possible that what I'm doing outside of the library calls can affect what happens inside, but I don't know in what way. Partly that's what I was hoping someone could tell me.
About the Status() call, I initially was just setting the lblStatus.Caption property, but the form window didn't change until the whole process was finished and it said "Done." Calling ProcessMessages allows the form to refresh and show the latest status text that was sent to it.
I tried your suggestion and commented out the internals of Status(), and it still freezes, only it won't tell me where.
Your question about the target platform got me wondering. It's definitely x86. I've been running it on Windows 7, so I thought I would try it on an XP box that I had available and I could not get it to freeze on the XP box. I then had a few of my colleagues try it on their Windows 7 computers and some could get it to freeze and some could not. I'm trying to identify patterns but I'm not finding anything yet.