I did a very similar (pretty much exactly the same) thing in one of my earlier missions.
Ordinarily, I'd post up the source but I'm afraid I'm on holiday and don't have access to it... It went something like this though (I'll use your first menu as an example, and you can go from there):
VariablesI1menu = false (
infantry 1)
I2menu = false (
infantry 2)
etc...
Infantry 1 menu TriggerRadius: 0,0
Condition: Radio Alpha
Condition field: this and (not I1menu) and (not I2menu) and not... etc
OnActivation field: ["I1menu"] exec "
Script.sqs"
Infantry 1 menu Item 1 (defend) TriggerRadius: 0,0
Condition: Radio Alpha
Condition field: this and I1menu
OnActivation field: ["I1defend"] exec "
Script.sqs"
Infantry 1 menu Item 2 (attack) TriggerRadius: 0,0
Condition: Radio Bravo
Condition field: this and I1menu
OnActivation field: ["I1attack"] exec "
Script.sqs"
Infantry 1 menu Item 3 (Withdraw) TriggerRadius: 0,0
Condition: Radio Charlie
Condition field: this and I1menu
OnActivation field: ["I1withdraw"] exec "
Script.sqs"
etc...
More triggers as required (There will be quite a few of them)
Script.sqs_call = _this select 0
goto _call
exit
#I1menu
I1menu = true
1 setradiomsg "Infantry 1 >> Defend"
2 setradiomsg "Infantry 1 >> Attack"
3 setradiomsg "Infantry 1 >> Withdraw"
4 setradiomsg "Infantry 1 >> Rendevous with group"
etc... as requiredexit
#I1attack
I1menu = false
1 setradiomsg "Infantry 1"
2 setradiomsg "Infantry 2"
3 setradiomsg "AT 1"
4 setradiomsg "Snipers 1"
etc...Inf1 domove (getpos
attackmarker)
etc..
exit
#I1defend
I1menu = false
1 setradiomsg "Infantry 1"
2 setradiomsg "Infantry 2"
3 setradiomsg "AT 1"
4 setradiomsg "Snipers 1"
etc..."dostop _x" foreach units Inf1
etc..
exit
And so it goes on. That's the way I did it... a very long time ago now. I'm sure if you put your mind to it you can come up with some improvements on that method
As for making the radio menu stay open... I don't think that's possible. It closes when the player executes a radio command
Good Luck