Having done some work recently on another vendor's systems, I saw an interesting approach to this. As things stand, it can't be used in Genesys Cloud, but if this idea were to be implemented, it would work.
The basic idea is to have all objects named with a consistent convention, where part of the name (say a suffix) is "Dev", "UAT" or "Prod". By allowing ALL objects to be referenced via an expression / variable, you can set a variable at the start (say, Flow.Env) and whenever referencing anything (say a Common Module, or an In_Queue Flow) you use an expression like "Flowname"+Flow.Env.
I am aware that something like this could be achieved using Switch statements, but that is clunky and also means that, strictly speaking, the code being pushed to production is not the same as that which was tested (albeit a very small difference.)
The idea of using CX as Code is interesting, but it does (I think?) assume separate ORGs, which not everyone has. Alternatively, it requires the exported configurations to be edited prior to re-import in order for all the references to get updated, which again introduces the possibility of errors.
------------------------------
Paul Simpson
Views expressed are my own and do not necessarily reflect those of my employer.
------------------------------