The previous statement is only partially correct. It is not entirely true that external commands are available only after a document is open in Revit. Even though that is the most typical approach, external commands can actually be invoked even without any document open at all.
I believe the major difference between external applications and external commands is that a command is directly linked to a UI control, while external applications are not. It is also true that external applications are loaded at the beginning of a Revit session and stay loaded until Revit shuts down. That is not guaranteed for external command. A Command only needs to be loaded when the end user clicks the corresponding UI control, and may also get unloaded after its execution (although Revit does not usually unload external commands - it keeps them in memory.)
So, to restate it: For every external command there is a UI control - usually a menu item in the AddIn menu, or a button on the Ribbon. When the end user clicks the control Revit invokes the external command by calling the Execute method, within which the command does whatever it was designed to do.
External applications do not require to have any UI controls at all. At the very minimum, they only need to implement two methods - OnStartup and OnShutdown, which Revit will call automatically when Revit start and closes, respectively. It is up to the owner of the external application what should happen in those methods. There is no default expectation. A typical external application may install some buttons to the Ribbon (and assign other commands to it), or may subscribe to events (such as DocumentOpened), or may register for Dynamic Updaters, etc. Or it may do all of the above.
I think that should explain the difference, in a nutshell. Naturally, there is a lot more to it. I recommend going through the SDK documentation and API tutorials to learn more.
Thank you
Arnošt Löbel