X(Variable) wouldn't work because expressions and objects are paired together. One object can have an expression which another object won't. It would be impossible to tell whether the expression you typed is valid and the object you chose is capable of executing that expression.
But if it were to happen, a lot of guards would have to implemented to fail silently on invalid input at runtime instead of at edittime, which is going to impact performance. (runtime = while the game is running, edittime = while developing the game in editor)
You can simplify your solution by doing this:
* Upon your action
Group.Good : Set Alterable String A to OName$( "Group.Good" )
* Upon your action
* Alterable String A of Group.Good = "MyObjName"
Counter : Set Counter to "Group.Good" )
If I recall, in the next update you'll be able to choose "Compare to object's expression", writing OName$( "Group.Good" ) in the top box, and "MyObjName" in the other, omitting the first event above completely.
That'll grab the X of the first object matching their name to "MyObjName". Ideally though you'd steer away from using strings this way as string comparisons get expensive.