^ Looks like a pretty solid setup but remember the area code when calling AreaTransitionXYZ.
About that ImportScript not working outside of a function, that actually sounds pretty strange. Based on my observations and knowledge of LUA, this is how everything works. Each running script gets its own little address space in Bully, and that script can't access variables from other scripts with a few exceptions such as gPlayer and the shared table (basically a table all scripts have access to, used for sharing variables). When ImportScript is called, it simply runs a script in the address space of the script that the function was called from. So if that script had functions or variables in it, they would be in your script's address space by the time the script finished running. Now you may be saying "but boss, those scripts can't run, they don't even have a main function!" and I could see why you'd think this, but in fact the main function isn't actually a normal thing in LUA, it's just something Bully does (and probably other games do too, but not LUA itself). This is how a LUA script will run (in order):
1) The entire script will be read top to bottom executing any instructions as it goes along, such as creating variables, tables, functions, calling functions, anything like that. When the script comes across a function declaration (like function MissionSetup() ... end or MissionSetup = function() ... end) it simply puts the function in memory and has that variable (in this example, "MissionSetup") reference it. Same essentially goes with tables having variables reference them but that's a different discussion. If you want one of your created functions to run, you could call them yourself and they'd run perfectly fine. Unless you do call a function yourself, no functions have run yet.
2) Now that the script has run and all functions are loaded and such, it is time for Bully to call some functions in your script. If it is a mission script (like ArcRace1.lur), Bully will call MissionSetup first, then main, and MissionCleanup when the mission is done (success or fail). If its just a normal script (like STimeCycle.lur), only main will be called. If the script is being imported (through ImportScript) then Bully will not call any functions (but of course any functions the script itself calls will run), the script will just run through normally, and since most scripts are structured in a way that mostly functions are the only thing in the outer level of the script (like nothing else is outside of any functions), then this will usually just load the functions from a certain script (but of course still run any code in the script that isn't in any function, unless of course that function is called).
So really I don't see any reason why ImportScript wouldn't work for you, it is still a part of your script and in theory should be executed.