This is the classic mistake of modifying the collection that you are iterating. Most collection classes generate an exception when you do that, unfortunately ControlCollection doesn't. It just misbehaves, you'll skip the next control after the one you remove. There's another nasty bug, the Controls.RemoveAt() method doesn't dispose the control you remove, it leaks forever.
Avoid the iteration bug by iterating backwards. And properly dispose, like this:
for (int i = this.Controls.Count-1; i >= 0; i--) {
if (this.Controls[i].GetType() != typeof(MenuStrip)) {
this.Controls[i].Dispose();
}
}