В общем сделал вот так:
//Фиксация первой колонки
function firstColFixed(firstColLedge){
//menu_col_inner_wrap - обёртка содержимого внутри первой колонки
if(firstColLedge > 0){
if($(this).scrollTop() >= firstColLedge && !$('.menu_col_inner_wrap').hasClass('left_col_fixed')){
$('.menu_col_inner_wrap').addClass('left_col_fixed');
$('.menu_col_inner_wrap').css('top', '-'+firstColLedge+'px');
}
if($(this).scrollTop() < firstColLedge && $('.menu_col_inner_wrap').hasClass('left_col_fixed')){
$('.menu_col_inner_wrap').removeClass('left_col_fixed');
$('.menu_col_inner_wrap').css('top', 'none');
}
}
}
//Исходные данные
var firstColHeight = $('.menu_col').height();
var windowHeight = $(window).height();
var firstColLedge = firstColHeight - windowHeight;
$(window).resize(function(){
firstColHeight = $('.menu_col').height();
windowHeight = $(window).height();
firstColLedge = firstColHeight - windowHeight;
});
//Запуск функции при загрузки страницы
firstColFixed(firstColLedge);
//Запуск функции при скролле
$(window).scroll(function () {
firstColFixed(firstColLedge);
});
тут menu_col - это первая колонка которую надо фиксировать, а menu_col_inner_wrap - это обёртка внутренностей этой колонки, чтобы не нужно было мудрить с отступами, когда на menu_col_inner_wrap вешается класс с position:fixed и она выпадает из потока.