When I’m demoing endless runner mechanics I normally generate all necessary objects prior to gameplay, and add and remove them from the game scene as needed. That way there is no object generation lag, and it maintains structure for cleanup when leaving the scene (if necessary).
RoamingGamer did a mini-thesis on this topic at the beginning of the year, if you’d like to look over the results:
https://forums.coronalabs.com/topic/61316-object-caching/
EDIT: I realized that I might not have adequately answered your question.
IMO the best practice is to NOT create the objects on the fly, but have them created and available to be implemented in the gamescene as needed. In reality, one would decide how many of each object is needed at one time, generate that many objects, and cycle through them as needed.
For example, if you have birds (obstacles) flying towards a car (player), you would identify the maximum amount of birds that you believe would be “visible” in a scene at one time, and generate that many prior to the start of gameplay. These would be in a table (fe birds[i]) and you would loop through your birds table, checking whether they are or are not currently active in gameplay. If they are, you skip that object. If they are not, you act on that object. Once they complete their action, they are removed from gameplay and their currently active flag is set to false.