Using script controller, you can get (and in some cases set) anything that's accessible from global scope. That said, there's a reason nobody does that - those variables and struct instances have to exist before the scripted controller first fires, which usually means right after opening the scene, merging an object using that controller etc. You can work around the first case by making the variables persistent. This works well enough when they hold a reference to some of the objects available by default but will fail with custom struct unless you make sure their definitions are evaluated beforehands - so now you have one more file to distribute with the .max file together with the instructions on where to put it.
Instead, use custom attributes. They make it easy to store almost anything, from ints, floats, colors, maps, materials to objects and referenceTargets. You can also use locals (limited to the current session lifetime), functions and structs inside them (struct instances' lifetime is once again limited to current session only).
What to attach them to and how to access them depends on the task at hand, there's no universal solution. If you have a particular scenario in mind, make that a new question and try to be as specific as possible.