Como resolver?

O ponto chave nesse desafio é conseguir contar e armazenar a contagem de cada caractere da string para comparar as contagens. Uma das formas possíveis de conseguir isso é através de objetos.

Resolução

Para resolvermos esse desafio podemos criar um objeto para armazenar a quantidade de cada caractere. A flexibilidade dos objetos do javascript e a capacidade de manipulá-lo através da sintaxe de colchetes nos permite armazenar as contagens dos caracteres em propriedades nomeadas como os próprios caracteres. Com isso, fica fácil guardar a contagem de cada caractere e referenciá-la no código.

Após contar todos os caracteres tudo o que precisamos fazer é verificar se a contagem deles está igual, e podemos conseguir isso através dos métodos Object.values(), que retorna as propriedades do objeto na forma de um array, e Array.every(), que verifica se todos os elementos de um array satisfazem a um determinado teste:

Obs.: Apesar de pouco mencionados, os métodos de arrays, como forEach, map e every, aceitam vários parâmetros opcionais além do elemento atual do array. Nesse desafio esses parâmetros serão especialmente úteis para referenciar elementos anteriores do array dentro da função de callback.

function isBalancedString(str) {  const charCount = {}

  for (let i = 0; i < str.length; i++) {
    charCount[str[i]] = charCount[str[i]] ? charCount[str[i]] + 1 : 1
  }

  return Object.values(charCount).every((count, index, array) => index !== 0 ? count === array[index - 1] : true )
}

Refatorando

Uma das formas que podemos deixar nosso código mais organizado é declarando separadamente a função de callback usada pelo .every():

function compareCounts(count, index, array) {
  return index !== 0 ? count === array[index - 1] : true
}

function isBalancedString(str) {
  const charCount = {}

  for (let i = 0; i < str.length; i++) {
    charCount[str[i]] = charCount[str[i]] ? charCount[str[i]] + 1 : 1
  }

  return Object.values(charCount).every(compareCounts)
}