We have this working. Sounds like you are doing it correctly. But in case it helps i'll explain what we do.
I have to set the service name at runtime so each EXE reports to Windows the correct service name.
So in Global Embed | Self Service - Initialize Variables, I set the ServiceName in a variable, and use that variable for the SelfService Global Externsion. We control this servicename via the command line (we do this so we can run all EXEs from the same folder and they can all use the same INI file for their other config).
SelfService cannot create our Service Setup correctly as we need to add a command line parameter (it can probably do it via code), but we are used to using the SC command, so thats what we do. eg
sc create InhabitMove1 type= interact type= share start= auto binpath= "C:\MOVE\MOVE.EXE ServiceName=InhabitMove1 IP=192.168.0.100" displayname= "Inhabit Move Server 1"
sc description InhabitMove1 "Core CRM Web Server"
sc create InhabitMove2 type= interact type= share start= auto binpath= "C:\MOVE\MOVE.EXE ServiceName=InhabitMove2 IP=192.168.0.101" displayname= "Inhabit Move Server 2"
sc description InhabitMove2 "Core CRM Web Server"
Then I make sure "Only Allow One Instance to Run at a time" is unchecked.
Two services will appear and they can both be started and stopped independently.