In any real scene, you’re going to have to be rebuilding most of your command buffers every frame anyway. So there’s no need to attribute that cost to push constant usage.
Also, it’s unlikely that the push constant storage will be sufficiently large for all of your per-frame data. Most implementations give either 128 or 256 bytes for push constants, no more. 128 bytes is barely enough for two matrices.
So either way, you’re going to have to do some buffer work. The real question is how you go about telling the shader which buffer to use. Do you use a dynamic UBO binding, where you change the UBO offset on a per-object basis? Or do you pass an index via a push constant?
Or do you avoid UBOs and push constants, in favor of using the DrawID and multi-draw rendering? The index is the DrawID, and you fetch from an SSBO (since if you’re drawing most of your scene from a single draw call, you will almost certainly exceed the limits of a UBO).
Pick the one you feel works best for your needs.