When loading in a DLL you are loading into the current AppDomain (at least using the methods you describe in your question). When you are loading it, the load happens in the same thread that calls the function that loads the DLL.
As SA said, loading a DLL into an AppDomain is very fast, as the code is not compiled or JIT'd until its actually run. The problem you may have however is a little different. All UI components run on the same thread (the UI thread), so you really can't load your form into a different thread, it'll always be on the UI thread.
The slow part is the "invoke", which uses reflection. I'm really not sure the best way around this in VB, but in C# if we know the method name prior to compile time we can use dynamic methods, like:
dynamic userForm = Activator.CreateInstance("KMDLL.GUI_MainForm");
userForm.SomeProperty = somevalue;
userForm.SomeMethod();
The operator on the right side of the "." isn't evaluated until run time, so we can call anything we want without the compiler complaining that it doesn't exist. This is faster than using Invoke, invoke is up to 100 times slower than just calling the method. Look up faster was to do invoking on google for more help.