Thanks for the info.. The following section helped me work out where I was going wrong:
All .MSI updates will be executed silently with the /qn command switch. If you plan to use the updater with custom .EXE installers, you must set each update's "Command Line" field with the proprietary silent command switch from its Update Properties Tab in your updates configuration project. If not, the UI will not be shown because the updater runs as a service.
My installer projects are all set to use the .EXE wrapper. Running the packages manually with "/qn", I can confirm they all install correctly (as upgrade or fresh install), so all I was missing here was literally the command line parameter in the updater configuration.
Thanks for pointing that out, can't believe I missed something so simple.