Yes, it is completely usable.
How it works is that FlexUnit tries to see if there is a mx.core.Container linked into your project. If there is, it uses that as the basis for the UIImpersonator. If there isn't one, then it uses spark.components.Group.
It does this because it is possible to compile in Flex 4.x with or without the MX components.
If your project has both, MX and Spark, then you can continue to use addChild() and you should be able to add either spark or mx components to the display list with 4.1. If your project is spark only then you need to use addElement(). We are just trying to make this cleaner for future releases but it does work now.
As far as the loader, etc. I certainly understand why you are doing that and if it works then by all means its a good solution. FlexUnit was never intended though to be able to test full applications, so things like applicationComplete were never on our radar. So, for now, you will need to continue your work around to have that functionality or, you could always manually dispatch it (myApp.dispatchEvent( new Event("applicationComplete") ) ) at the appropriate time.
HTH,
Mike