My 2 cents:
1) The .crx should always be preferred (unless both .arx or .crx may exist, and the app utilizes additional functionality in the .arx when it is available). The reason is two-fold. First, code should usually be optimized for the most recent version of AutoCAD, since over a typical app's lifetime it will be running on the current or a later version of AutoCAD much more often than on older versions of AutoCAD. Second, it's best to minimize dependencies, and in the event both a .crx and an .arx are available (or will be in a future AutoCAD), choosing the .crx results in fewer dependencies.
2) It's usually a bad idea to check whether the dependent module is already loaded instead of just going ahead and loading it, again for two reasons. One, there is very little performance benefit, and possibly even a net loss if the module usually is NOT loaded. Two, the act of calling (arxload) might be the mechanism that expresses a dependency on the module -- and if it is, then skipping the (arxload) could mean the module might be unloaded between the time it's status is checked and the time it is used. In fact, current versions of AutoCAD do not perform reference counting via (arxload), but there is such a mechanism under the hood that is used by ObjectARX apps, and it could very well be utilized in a future version of AutoCAD.