Thanks gentleman - getPhysicalTableName() was a great lead. I took a scattergun approach to printing the table names throughout initialization and operation, and while the two tables do eventually link correctly with the same table name, they take a roundabout way of getting there.
I have a working solution whereby I run a select statement on the buffer reference prior to the linkPhysicalTableInstance operation, which seems to act to initialize the buffer reference despite it being empty. The linkPhysicalTableInstance operation then succeeds at the first run because the buffer properly exists - and changes written to the form DS are now persistent and reflected in the calling Wizard's buffer reference. It is perhaps a bit of a workaround but it works exactly as expected now and is efficient enough. It would be interesting to know why these tables are not initializing as expected when they are empty but I'm all good.
Thanks very much Martin and Brandon, a pleasure to interact with two DAX legends.
Learnings:
- The buffer reference is only acquiring a table name after the runtime form has been closed OR a select statement is run on it before the link.
- The form DS is not acquiring a table name on initialization, it only acquires a table name after being linked to the buffer reference, and then only when the buffer reference has a table name.
TESTING RESULTS
Test 1 - Linking the form DS with buffer reference and inserting in to form DS
1st Run: For the first time of running the runtime form
- Neither tables have a name until the form's close() method. No records are created in either table.
- At the form close method, only the form DS has a table name.

2nd Run: Then when the runtime form is run again (during the calling form's lifetime):
- At startup, the reference buffer from the calling form has a table name but the form DS does not.
- After the super() call in the form DataSource's init() method but before the linkPhysicalTableInstance() call the form datasource still hasn't got a table name.
- After the linkPhysicalTableInstance() in the form DS init() method, the form DS finally has a table name, and it matches the calling form's buffer reference.

This implies that the form DS is only being initialized correctly once linked with the buffer reference, and then only when the buffer reference has been properly initialized. And the buffer reference only appears to be initialized once a record is entered!
My ability to add records to the form DS has gone off a cliff since using the default New Record method with initValue(), new records are just not being registered. So reverting back to inserting in to the buffer reference, I get different results:
Test 2 - Linking the form DS with buffer reference but inserting in to buffer reference
1st Run -
- Again, neither tables have table names at the start.
- After a record has been entered then both the buffer reference and the form DS tables have matching physical table names.
- But only the buffer reference contains the new records (which did not appear in the grid, as the form DS didn't know about them).

2nd Run: When running the runtime form again during the calling Wizard's lifetime:
- Again the buffer reference has a table name, the form DS does not
- After the linkPhysicalTableInstance call, the form DS has a table name, this seems to work because the buffer reference already has a name.
- Once the runtime form is closed, then both the buffer reference and the form DS contain the same records (and the new records appear in the form DS as well this time).

Finally, with/without SELECT Statement to initiliase the empty buffer reference prior to linking with form DS
Test 3 - Linking the form DS with buffer reference and inserting in to form DS WITHOUT the SELECT statement
1st Run & 2nd Run:
- No table names for either source at first, then buffer ref has a name, then the form DS does after linking.
- Changes not persistent.
- Note: info print statement after select should read LINK not POP

Test 4 - Linking the form DS with buffer reference and inserting in to form DS WITH the SELECT statement
1st & 2nd Run:
- As before, neither the form DS or buffer reference has a table name after initializing.
- Running a basic SELECT statement on the buffer reference in the form DS init() method prior to the linkPhysicalTableInstance seems to properly initialize the (empty) buffer and allows the link to be successful.
