I'd say it's because, even if you call garbage collector, memory is not freed in the same moment. By calling garbage collector multiple times, you force it to free memory right now.
In addition, calling a gc method on an object (usually userdata) may free some resources, which only after this can be collected. And this can go for several levels deep, so you may want to call collectgarbage() for each new level. In other words: sometimes you cannot free all unused objects at once, because some of them are still used (referenced), even if you think they are not. See there: http://www.lua.org/manual/5.1/manual.html#2.10.1
Comments
In other words: sometimes you cannot free all unused objects at once, because some of them are still used (referenced), even if you think they are not. See there: http://www.lua.org/manual/5.1/manual.html#2.10.1