Как насчет того, что сказал @osoner + вместо того, чтобы делать все вычисления в обработчике даже для прокрутки, вы запускаете другое событие в обработчике через некоторый интервал (например, 'fooscroll'), а затем все дочерние элементы подписываются насобытие и обновлять себя в зависимости от установленных вами условий.
var scrollTimer;
$(window).on('scroll', function(e) {
if (scrollTimer) { clearTimeout(scrollTimer); }
scrollTimer = setTimeout(function() {
$(window).trigger('fooscroll');
}, 200);
});
$('li').on('fooscroll', function() {
// Check scrollTop or whatever...
});