Si ningun plugin logra hacer lo que deseas, lo mejor es que crees uno de acuerdo a tus necesidades, despues de todo tienes jQuery mobile y este da facilidades.
Aca te dejo un simple plugin que hize:
var pullFresh = function(selector, options)
{
    'use strict';
    if( $(selector).find('._wrapper').length === 0)
    {
        $(selector).css('position', 'relative');
        $(selector).wrapInner('<div class="_wrapper">');
    }
    var container = $(selector).find('._wrapper'),
        drag = false,
        start_pos,
        callbacks = {},
        perform_callback = function(callback)
        {
            var args = Array.prototype.slice.call(arguments);
            if(callbacks[callback])
                callbacks[callback].apply(null, args.slice(1));
        },
        pull_pos = function()
        {
            return parseInt($(container).css('top'), 10);
        },
        reset_pos = function()
        {
            drag = false;
            $(container).stop().animate({
                top : 0
            }, 100);
        },
        set_default_opts = function(options)
        {
            var default_opts = {
                threshold : 100,
                offsetTop : 0
            };
            for(var opt in default_opts)
            {
                if( !options[opt] )
                    options[opt] = default_opts[opt];
            }
            return options;
        };
    options = set_default_opts(options || {});
    this.on = function(type, callback)
    {
        if( $.inArray(type, ['refresh', 'pull', 'start-pull', 'end-pull', 'init']) === -1)
            return false;
        callbacks[type] = callback;
        return this;
    }
    if( isNaN(pull_pos) )
    {
        $(container).css({
            'top': 0,
            'position' : 'relative'
        });
    }
    $(container).on('vmousedown', function(event){
        drag = true;
        start_pos = event.pageY;
        perform_callback('start');
    });
    $(container).on('vmouseup vmouseleave', function(event){
        drag = false;
        reset_pos();
        perform_callback('end-pull');
    });
    $(container).on('vmousemove', function(event){
        var pull_offset = (event.pageY - start_pos),
            pull_percentage;
        if( !drag )
            return false;
        if( ($(window).scrollTop() - $('.content').offset().top) > options.offsetTop )
            return false;
        if( pull_offset >= options.threshold ||  pull_offset < 0)
        {
            reset_pos();
            perform_callback('end-pull');
            if(pull_offset >= options.threshold)
                perform_callback('refresh');
            return false;
        }
        $(container).css('top', pull_offset);
        perform_callback('pull', pull_offset, (pull_offset * 100) / options.threshold);
    });
    return this;
};
funciona de esta forma:
new pullFresh('.selector', {
    threshold : 200
})
.on('refresh', function()
{
})
.on('pull', function(pos, percentage)
{
})
.on('end-pull', function()
{
});
la sintaxis:
new pullFresh( selector, opciones )
.on( evento, callback() )
demo:
http://jsfiddle.net/9zcccnkf/1/embedded/result/
http://jsfiddle.net/9zcccnkf/1/