You seem to be on the right sort of track with this.
Using separate 1-D arrays rather than a large data-structure is good, because it allows you to use find (otherwise you spend a lot of time in iterating through a big structure).
The immediate issue with this is that you can only ever set values on one machine, ideally the server. For example, should the player sell something and get then set, he might overwrite the get/set from someone else transferring money to him. If you are just using numbers, then an add and subtract could more safely replace set. You still have to make sure that subtractions are only run on one machine, or values could go below 0. Alternatively, having subtract with a callback function when it has been confirmed that the value can be reduced.
While I was scanning the scripts, I noticed a few things you might appreciate:
Since publicVariable just takes a string,
call compile format ["publicVariable """ + SMB_PDS_PREFIX + "%1"";", _masterIndex];
can be simplified to:
publicVariable (SMB_PDS_PREFIX + (str _masterIndex));
You can also simplify:
call compile format ["_value = " + SMB_PDS_PREFIX + "%1 select %2;", _masterIndex, _keyIndex];
to (and although I like using + for strings too, it is confusing, for me at least, when you use format and + at the same time).
_value = call compile format ["%1%2 select %3;", SMB_PDS_PREFIX, _masterIndex, _keyIndex];
_nameList = [];
{_nameList = _nameList + [_x];} forEach SMB_PDS_master;
is equivalent to
_nameList = [] + SMB_PDS_master;
Though when you do this, you just use the new array once for a find, so no reason to copy the array in the first place.