For what it’s worth, I have a LOT of templates because I do the clone-and-install routinely.
I don’t install ANYTHING directly on the provided template (be it “minimal” or the full xfce template). I clone to create a sys-base, which has very little on it (stuff to set up my terminal environment mostly); I make sys-net, sys-firewall and so on by cloning that.
Qubes I’m actually likely to do things on descend from a different clone of sys-base which I probably should call app-base, but I just call base. And that gets cloned dozens of times (including clones of the clones) with different apps installed. (However in many cases the only difference between two templates is what it accesses; e.g, usb devices versus the internet–I am trying to get the differences down to stuff that can be done in AppVMs; which will eliminate at least a dozen templates. Templates take up space and take forever to build; just the clone of the (originally minimal) template can take five minutes apiece.)
Something as nasty as your proprietary VPN sounds, I would definitely have in its own template.
Background: /usr/local/bin on the AppVm gets brought over from /usr/local.orig/bin the first time you run the AppVm. So if you are installing something on the template you want to appear in /usr/local/bin (or any other /usr/local/* directory) you must put in /usr/local.orig/. If you are intending to install to /usr/local/bin on the AppVM then install to /usr/local/bin
One thing I have sometimes done is to install a small package I don’t really need everywhere in a template, but then I do one thing to “cripple” it (like moving a file it can’t work without into /usr/local.orig/bin, linking to it (in /usr/local/bin; which is where it will be after the appvm is created) from /usr/bin and then I rename the file). Note that that file will appear in AppVMs but can be modified by them. Then when I create the AppVM I either delete the file (permanently disabling the package), or change it back to the original name (re-enabling it). If that verbal description is a bit bewildering, here is pseudo-code:
(while building the template)
install package X
move critical-file to /usr/local.orig/bin
rename critical-file to critical-file-save
link /usr/local/bin/critical-file /usr/bin/critical-file
[if the template were to run, the package wouldn’t work because the file it depends on appears to be a link to nowhere]
(while building an appvm that uses package X)
rename /usr/local/bin/critical-file-save to /usr/local/bin/critical-file
[now when running that appvm the link in /usr/bin points to somewhere useful]
(while building an appvm that does NOT use package x)
rm /usr/local/bin/critical-file-save
[This package can never run on that appvm.]
Another possibility I also use is to do the install in the appvm where it’s needed, but then copy files from /usr/bin to /usr/local/bin (which will exist once you start the appvm); generally things in /usr/share can be relocated to the corresponding path in /usr/local/share; e.g. /usr/share/icon/my_icon copied to /usr/local/share/icon/my_icon. When you shut down the appvm the installs to /usr/bin, etc., disappear but the ones in /usr/local/bin, etc. remain, and /usr/local/bin should be in your path (and the software that reads desktop files and looks for icons knows about /usr/local/share). The tricky part here is to ensure you find the files, but at least with apt, a file is written [you’ll have to google this] listing every file that is installed; read that and write some script to do those copies. [Or if using salt, write a state to do the copies.]
Note that if the installation package creates a systemd service this might not work well. Systemd as far as I know (someone correct me if I am wrong) won’t look in /usr/local for anything it needs.