Длина массива действительно ограничена, а от длины слова количество вариантов растёт экспоненциально.
Но можно лёгким движением руки превратить функцию в генератор, и получить столько значений сколько надо
:
function* generate(arr, n, startIndex){
for(var length = arr.length, i = Math.pow(length, n) - (startIndex||0), temp = new Array(n), j; i--;){
j = n;
while(j--){
temp[j] = arr[i / Math.pow(length, j) % length | 0];
}
yield temp.join('');
}
}
var generator = generate(['A','B','C','D','E'], 4);
alert(generator.next().value);
alert(generator.next().value);
Ограничены вы только временем.)