A set of n items has 2ⁿ subsets, one for every bitmask from 0 to 2ⁿ − 1. Bit i says whether item i is in or out:
for (let mask = 1; mask < 1 << n; mask++) {
let sub = "";
for (let i = 0; i < n; i++) if (mask & (1 << i)) sub += s[i];
}
Iterating bitmasks is the simplest way to enumerate subsets. The recursive alternative is include/exclude: for each item, branch once with it and once without it.