This is one of those old-fashioned Windows batch bugs that only manifests after interactive operations are discontinued.
Your.bat is launched in a non-interactive session by TRIGGERcmd. Even if you say "foreground," there isn't a true console connected, so anything that thinks it's a tty may silently misbehave. The reason your script gets beyond taskkill but never reaches the restart is because TIMEOUT is infamous for its ability to either quit instantly or block strangely when there is no interactive terminal.
it also explains why there isn't a window: Unless you specifically force a visible cmd.exe session, TRIGGERcmd is not generating one.
Avoiding TIMEOUT in this situation is the solution. It spins up its own process with a suitable wait handle, thus wrapping it with start/wait works. For the same reason, ping 127.0.0.1 -n X works; console state is irrelevant. If you really want to view output, using cmd /c or cmd /k manually is a good alternative.
Additionally, ensure that the program.exe is launched using the whole path rather than just the working directory. Since C:\Windows\System32 is often used as cwd when triggers execute, relative paths will fail silently.
In summary, it's not a TRIGGERcmd problem or a permissions issue. Batch + non-interactive Windows execution is used. It will act the same as if you ran it locally if you change the TIMEOUT and use complete paths.