Вопрос на засыпку: почему offsetTop иногда равен undefined?
Потому что jquery всегда возращает массив. Даже для одного элемента.
$('.div') - это массив.
А у массива нет offsetTop
В первом случае вы пытаетесь считать свойство offsetTop у jquery коллеккции, которого не существует. Во втором же все верно, ибо по индексу [0] там обычный DOM элемент, у которого это свойство есть. Для работы с jQuery коллекциями следует использовать метод offset().