It's a well known issue in Quake, although I've never got exactly to the bottom of the sequence of events in the engine. The basic problem is that when you restart the map, the player entity is added at a different point in the startup sequence than when you load the map normally. It's all done with a bunch of behind the scenes console commands and messages.
I think that what happens is that in the normal case, the player is not added to the world until all the items have dropped to the floor, so everything works fine. In the restart case, because the client is already connected, I think the player's entity gets added before the items have a chance to drop. Because they spawn inside a player, they count as stuck, and so fall through the floor.
Anyone with good engine know-how able to back this up? Or better yet explain where in the code the differences arise?