Потому что при переходе от родительского узла к дочернему не происходит mouseout, мышка так и находится над родительским элементом. Но можно запретить распространение события, и тогда все будет ок
Если функция асинхронная, то иначе, как через колбеки, получить значение у вас не получится, а промисес - это тоже своего рода колбеки, только реализованные более удобным способом