Why enqueue styles on hook?

There is code that needs to run, thing that need to be setup, before you enqueue. If you enqueue too early those prerequisites will not be filled and you will see …

Notice: wp_enqueue_style was called incorrectly. Scripts and styles
should not be registered or enqueued until the wp_enqueue_scripts,
admin_enqueue_scripts, or init hooks. Please see Debugging in
WordPress for more information.

… if you have debugging enabled.

The register/enqueue system is complex– look at the files named class.wp-scripts.php, class.wp-styles.php, and class.wp-dependencies.php. It does not just echo content to the page header. The code tries to handle dependency loading and prevent the loading of the same file more than once. For that to work things have to be registered and enqueued at the right time in the load process, hence loading on hooks.

That is not to say that enqueueing a file immediately won’t work. It might. It depends on where you try to enqueue. As per the message, you need to enqueue after wp_enqueue_scripts, admin_enqueue_scripts, or init. Even so, I believe that some things don’t work if you enqueue after wp_enqueue_scripts. For example, you can’t get a file to load in the header if you try to enqueue it late in the page load. So be careful with it and just try to avoid hook-less enqueueing.