Эта задача не требует хаков, или дополнительных циклов. Задача действительно решается в один цикл. Не надо городить огород:
String.prototype.hasAt = function(needle, pos)
{
var i = Math.min(this.length, Math.max(0, Number(pos) || 0));
var j;
var found;
for ( ; i < this.length; i++) {
if ( found ) {
if ( i - j == needle.length ) {
return j;
}
found = this.charAt(i) == needle.charAt(i - j);
} else {
found = this.charAt(i) == needle.charAt(0);
if ( found ) {
j = i;
}
}
}
return found && this.length - j == needle.length
? j
: -1;
};
Для "чистоты" эксперимента следовало бы заменить Math.min/Math.max соответствующими проверочными условиями, чтобы позиция начала поиска не выходила за пределы строки. Но это не существенно.