Kann ich Plugins zur Laufzeit aktualisieren/nachladen, nachdem schon Module geladen/Funktionen ausgeführt wurden?
Ja, kannst du 
In Lua kannst du Funktionen / Variablen / Objekte etc. nach belieben überschreiben und damit auch zur Laufzeit aktualiseren. Hier mal ein sehr vereinfachtes Beispiel:
Entsprechend die Ausgabe:
λ lua54 "c:\Users\Yjuq\Desktop\code.lua"
Nur um mal deine Frage oben zu beantworten. Ein Modul ist in Lua nichts weiteres (zumindest meistens) als eine einfache Funktionssammlung. Du kannst also das Ganze "hotpatchen".
Da fehlt dann einiges an Routine um flott zu coden - 12 Jahre Erfahrung krieg' ich in Lua demnächst nicht mehr Zusammen.
Lua ist wirklich einfach. Und der Unterschied zu AutoIt ist auch nicht besonders groß. Gib dir ne Woche Zeit um dich einfach mit den Basics zu beschäftigen und du hast das nötigste für Lua drin. Lua hat nicht so viele Features dass du davon überrumpelt werden könntest. 
Am liebsten hätte ich die Programmiersprache Self - in abgespeckt und ein ganz klein bisschen anders, und simpler - einfach zu verstehen und nutzen im Büro/Enterprise-Kontext.
Lua... 
Ich bin mit den Services und der Laufzeitumgebung meiner Applikation aber schon weit fortgeschritten und am Point of no Return vorbei - alles noch einmal auf Lua umzubauen,
Ja, das war mir bei meinen ersten Post schon bewusst. Ich sage ja auch nicht alles umbauen, ich sage nur Lua intigrieren für zukünftige Sachen. Was du hast kannst du einfach einbinden. Du brauchst nicht viel umschreiben, lediglich alles was du hast für Lua einmal registrieren. Das war's. Deswegen hab ich dir das ja auch vorgeschlagen.
Zugriff auf alle Daten der Applikation gibts quasi automatisch da alles in einem Applikation Objekt liegt, das ich einfach mittels Parameter übergeben kann. Es ist im Prinzip nur die Frage der Eleganz, die ich im ersten Post stelle.
Das du eine funktionierende Lösung hast ist mir auch klar. Selbst mit dieser Information würde ich immernoch Lua vorschlagen...
Lua ist nun perfekt für solche Projekte geeignet. Deswegen schlage ich es ja auch vor. Ob du das eleganter in AutoIt lösen könntest? Keine Ahnung, wenn ROT funktioniert dann reicht es aus.
Hier mal noch ein letztes Beispiel wo ich gerade dran saß:
; ------------------------------------------------------------------------------
; ------------------------------------------------------------------------------
Local Const $lua = LuaL_newstate()
; expose our magic functions into lua
lua_pushcfunction($lua, autoit(Null))
lua_setglobal($lua, "autoit")
; ------------------------------------------------------------------------------
; first we read the value:
luaL_dostring($lua, "print(autoit('get', 'var'))")
luaL_dostring($lua, "autoit('set', 'var', 'lua')")
ConsoleWrite($var & @CRLF)
; and now we call a function
luaL_dostring($lua, "print(autoit('call', 'callme', 'au3', '<3'))")
Func callme($param1, $param2)
ConsoleWrite($param1 & @TAB & $param2 & @CRLF)
; it's not bounded to udfs :P
luaL_dostring($lua, "autoit('call', 'MsgBox', 0, 'title', 'text 1')")
; if you don't like the syntax you can declare wrapper functions in lua:
luaL_dostring($lua, "function MsgBox(flag, title, text) autoit('call', 'MsgBox', flag, title, text) end")
luaL_dostring($lua, "MsgBox(0, 'title', 'text 2')") ; Here the call
; ------------------------------------------------------------------------------
; a magical function in order to manipulate anything for autoit in lua
Local Static $func = DllCallbackRegister(autoit, "int:cdecl", "ptr")
Local Static $ptr = DllCallbackGetPtr($func)
If $lua = Null Then Return $ptr
Local $arg = getArgs($lua)
Switch $arg[0] ; -> command
Case "get" ; get autoit value
$tmp = Eval($arg[1]) ; get value
pushForLua($lua, $tmp) ; and push it for lua
Return 1 ; something on the stack
Case "set" ; set autoit value
; arg[1] -> variable to modify
Case "call" ; call autoit function
; first we build the function call
For $i = 2 To UBound($arg) - 1
If IsString($arg[$i]) Then $arg[$i] = '"' & $arg[$i] & '"'
$tmp = $arg[1] & "(" & StringTrimRight($tmp, 1) & ")"
pushForLua($lua, $tmp) ; return
; get the arguments from a function call
Local $n = lua_gettop($L) ; number of arguments
Local $a[$n] ; array for the arguments
For $i = $n -1 To 0 Step -1
; converts a value on the stack for autoit
Switch lua_type($L, -1) ; last element on the stack
$return = lua_tonumber($L, -1)
$return = lua_toboolean($L, -1) = 1
$return = lua_tostring($L, -1)
; push something for lua into the stack
Func pushForLua($lua, $var)
lua_pushboolean($lua, $var)
lua_pushinteger($lua, $var)
lua_pushnumber($lua, $var)
lua_pushstring($lua, $var)
lua_pushinteger($lua, $var)
; ------------------------------------------------------------------------------
Alles anzeigen
Ich war gerade dabei noch die AutoIt Objekte einzubinden, also eine einfache Funktion die dir ermöglicht auf alle deine vorhandenen AutoIt Objekte zuzugreifen. Die autoit() Funktion ist die Schnittstelle zu den gesamten AutoIt Built-In Funktionen. Ich hab aber leider gerade ein paar Probleme mit dem AutoIt Objekten weil Eval / Assign / Execute für diese bei Zuweisungen nicht so einfach funktionieren. War gerade dabei zu schauen ob ich nicht die Invoke Methode aus dem IDispatch Interface für diese Objekte nicht irgendwie aufrufen könnte. 
Um aber mal zurück zu rudern:
Ich bezweifel dass du das mehr eleganter in AutoIt lösen könntest als die Lösung die du momentan hast. Zumindest fällt mir da so nichts mehr dazu ein. Falls das deine Ursprungsfrage eher beantworten sollte. Ich hatte lediglich Lua vorgeschlagen weil es für deine Ansprüche eigentlich eine sehr gute Lösung ist. Vielleicht hat jemand anderes noch eine Idee? Mich wundert es sowieso warum sich hier keiner meldet. 