Is there a reason you are using meshes as the actual drawable type?
Typically a mesh/triangle soup would be a shared resource and you would instantiate them for drawing using a model/object. When you instantiate a model/object that needs a particular mesh you would increase a reference count and store a pointer - this is resource management 101 in a nut shell.
Call them what you will, I think you are not properly distinguishing between where the data is stored and the interface necessary to render it. You should not need a VAO for each and every instance of an object, and deletion of VAO/VBO should only occur once nothing references the vertex data any longer.