I believe that what you're talking about is a large number of individual draw calls to the rendering api vs a single large draw call to the rendering api.
There is CPU overhead associated with setting up the rendering state (binding vertex buffers, textures, shaders etc) as well as the actual draw call itself it is generally more efficient to render a large amount of geometry in a single call.
Note that Panda3D most likely attempts to reduce rendering api state changes such as bound texture and shaders by grouping renderables together so these need to be set the minimum number of times. But even with this optimisation if you are drawing many single objects, you must call draw in the rendering api which incurs unavoidable CPU overhead while communicating with the GPU.
The CPU-to-GPU overhead is something we want reduce as much as possible when using rendering apis such as OpenGL and DirectX. This is done in many ways but some optimisations that generally yield good results are to minimise unnecessary state changes and to batch geometry together to reduce the number of draw calls. This is what the flattenStrong command is doing for you.
To say it again, it is generally more efficient to render 1,000,000 vertices in a single draw call than it is to render 1,000 vertices in 1,000 draw calls. Therefore you could call this a fundamental law of the rendering apis which most game engines use under the hood.