Super duper old, но мне нужно было сделать что-то подобное сегодня и только подумать, чтобы проверить SO потом. Работает довольно быстро для меня.
String.prototype.count = function(substr,start,overlap) {
overlap = overlap || false;
start = start || 0;
var count = 0,
offset = overlap ? 1 : substr.length;
while((start = this.indexOf(substr, start) + offset) !== (offset - 1))
++count;
return count;
};