Sometimes when you use sp_engine “offline", the engine does not immediately go offline, and instead appears to be in “dormant” state in the engine table. This is caused by processes that are attached to your engine that cannot be migrated to other engines. When this happens, the engine does not take new work, and consumes minimal CPU cycles. When the process preventing the completion of engine offline either end or become available for migration, the engine moves from dormant to fully offline, and disappears from the engine table.
sp_engine "shutdown" is a more aggressive version of the offline command. sp_engine "shutdown" actively kills any processes that are preventing the engine from going offline, forcing it to shut down.
However, if you use sp_engine "shutdown" on an engine that has Client Library™ or Java connections, you see:
Engine has outstanding ct-lib/java connections and cannot be offlined.
When this happens, repeat the command again every few minutes until the connections are no longer there, and the engine can shut down.