First, if you are going to use exec which calls a script in SQS syntax, please name the script file with a .sqs extension.
SQF syntax (.sqf, called with execVM) should be kept mutually exclusive. Also, SQS is old, so you should start using SQF when possible.
Also, the semi-colon (;) a the end of each line in your sqs script is not required. A new line is considered the end of the last command. Semi-colons are only used when you choose to put two commands on one line. SQF is the syntax that requires semi-colons at the end of each line.
*Note* I only enclose syntax with < > clarification, not to be used as part of a script.
When calling a script from an init line of a unit or trigger, a variable to store the reference to the script (script handle) is sometimes required (namely the editor).
It's actually not required for the exec command, you can simply use <this exec "script.sqs";>
It is required for execVM, so use <Nul = this execVM "script.sqf";> or <_scriptname = this execVM "script.sqf";>
Most of the time you don't need to reference the script, so you use Nul or Null.
Nul is a safe variable to use, because everyone knows not to use it. It's considered a dummy variable.
*note* the reference varible only refers to the scriptname, it doesn't hold a return value as I previously thought.
An underscore (_) preceding a variable, such as <_this>, creates or refers to a local variable. It will not be shared outside the current scope, so, usually, when the script exits, the variable is forgotten. If you wanted to store the value, you would either use a global variable such as <money> (you can't define <this> because it's already used by the game) or you would pass it to another script <[_this, _money] execVM "nextscript.sqf";>
<exit> is considered exiting cleanly out of a SQS script, however, it is not required. If you left it out, the script would still exit. It can also be used anywhere in the script to terminate the script prematurely (e.g. if a certain condition is met). However, another method people use it <goto "end"> with #end place as the last line in the script.
A lot of times, you will see <if(true) exitWith{};> at the end of SQF scripts. This is considered exiting cleanly in SQF syntax.
There's a lot of confusion between SQF and SQS and what is required. What is considered good syntax is debatable.
The SQF version would look called with <Nul = this execVM "arm.sqf";>
arm.sqf
removeAllWeapons _this;
_this addMagazine "magName";
_this addWeapon "WeapName";
_this selectWeapon "WeapName";
if(true) exitWith{}; //not required
Check out my script:
Respawning with Saved Loadouts w/ preconfigurable Custom Loadouts