помимо события mouseover есть еще и событие mouseout
обычно делают так:
при mouseover, если меню еще не показано, то показать его, и сбросить таймер(о нем речь дальше)
при mouseout сделать
var timer = setTimeout(function(){/* здесь скрываем меню */}, 500);
соответсвенно, если пользователь неаккруатно повел мышкой, переходя в подменю, или же из-за неаккуратной верстки между подменю, и меню есть зазор(и такое бывает), то меню не пропадет сразу же