Well i though i would give you all an update.
I finally got it to work

but it is rather messy.
Can any body tell me why it would not work like this even though the variables hold the right info.
//Promote.sqf
_newRank = _this select 1;
_unit = _this select 0;
_unit setRank (format ["%1",_newRank]);
//RankXmenu.sqf
Rank_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression","nul= [groupSelectedUnits player,('CAPTAIN')] execVM 'RankX\promote.sqf'"]],"1","1"]
];
BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:Rank_menu",-5,[["expression",""]],"1","1"]
];
if (true) exitWith {};
instead i have to use this, which is so messy
//RankXMenu.sqf
sleep 1;
[] call BIS_fnc_commsMenuCreate;
Promote_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression","player sidechat ""this is Rank (submenu)"]],"1","1"]
];
Rank_menu = [
["Rank",false],
["Corporal",[2],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\corporal.sqf'"]],"1","1"],
["Sergeant",[3],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\sergeant.sqf'"]],"1","1"],
["Lieutenant",[4],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\lieutenant.sqf'"]],"1","1"],
["Captain",[5],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\captain.sqf'"]],"1","1"],
["Major",[6],"",-5,[["expression","nul= groupSelectedUnits player execVM 'RankX\major.sqf'"]],"1","1"]
];
BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:Promote_menu",-5,[["expression",""]],"1","1"]
];
if (true) exitWith {};
//Corporal.sqf
sleep 0.5;
_selected= _this select 0;
_newRank = "CORPORAL";
_selected setRank (format ["%1",_newRank]);
The Variable _newRank in both cases still holds the same value, but it only works when the variable is set in the same script.
I will no doubt be trying to clean it up, but any help in explaining the problem would be appreciated
Linrox