Ускорил свой вариант в 10 раз 

 используется массив вместо объекта для карты последних вхождений.
function maxUniqSubStr(str) {
    if (!str) { return ''; }
    var map = [];
    for (var i = 0; i < 256; ++i) {
      map[i] = -1;
    }
    
    var maxLength = 1;
    var maxStart = 0;
    var start = 0;
    
    for (var i = 0, le = str.length; i < le; ++i) {
        var c = str.charCodeAt(i);
        var pos = map[c];
        if (pos >= start) {
            if (maxLength < i - start) {
                maxStart = start;
                maxLength = i - start;
            }
            start = pos + 1;
        }
        map[c] = i;
    }
    if (maxLength < i - start) {
        maxStart = start;
        maxLength = i - start;
    }
    return str.substr(maxStart, maxLength);
}
alert(maxUniqSubStr('abcdeahopwunshslge'));