@finnecs has the right solution and it's much more clear than some other blog posts or videos on this subject. The Flow Definition is particularly complicated and annoying to work with. I'm responding to this thread in order to provide some more detail on how I've implemented the solution.
First, my Base Flow is triggered by changes in a document library. My project is to streamline the creation of new document libraries based on user inputs, which will also create a new flow dedicated to that new library.
I used a select data operation to map the connection references from the base flow:

The Flow Definition was prepared similarly to what @finnecs describes, but with a single compose connector:

json(replace(string(outputs('Get_Base_Flow')?['body/properties/definition']),body('Parse_JSON_2')?['d']?['Id'],body('Parse_JSON')?['d']?['Id']))
As @finnecs described, the first step is to convert the File Definition from the Get Base Flow connector to a string.
The second step was replacing the Library Id from the original flow with the new Library Id that was just created (what is replaced in each project will be highly dependent on what the copied flow is intended to do). The third part returns the format to JSON so that the output of this connector can be called in the Create Flow connector

(The Flow Definition is populated by the output of Compose 2, the connectionReferences is populated by the output of Select)
For informational purposes on how I collected the Library IDs, I created separate HTTP requests and then a companion Parse JSON connector for easy referencing. The image below illustrates the one set for the new Library. Note that the Output reference in the Uri field is calling a Library Name that was defined earlier in the flow. The same field in the second set is not dynamic since it only needs to know the template library name.
