Como resolver?

O ponto chave aqui é bem simples, precisamos encontrar uma forma de manipular a string para inserir uma outra string dentro dela nas posições corretas. Podemos fazer isso de diferentes formas, tanto usando strings como usando arrays, por exemplo.

Resolução

Vamos utilizar o método com arrays. Para isso vamos converter nossa string para um array de caracteres. Com esse array, agora iremos utilizar uma repetição com for indo de 0 até tamanho máximo da string onde vamos inserir o conteúdo, afinal não podemos inserir nada além desse ponto.

Dentro da estrutura de repetição podemos verificar se a posição atual é onde queremos inserir a string usando o método Array.includes(), ou seja, se ela está incluída na lista de índices. Para inserir a string podemos utilizar o método .splice() do próprio javascript, ele permite remover uma parte de um array para inserir outra em seu lugar, mas podemos optar por não remover nada.

Mas aqui precisamos estar atento a um detalhe, se apenas utilizarmos splice na posição atual isso irá funcionar da primeira vez, no entanto nas próximas vezes não irá funcionar corretamente, visto que o tamanho do array já aumentou quando inserimos um elemento. Para resolvermos isso podemos criar um contador fora da estrutura de repetição e a cada inserção bem sucedida o incrementamos em uma unidade, visto que assim ele irá acompanhar as nossas inserções. Agora só precisamos somar esse contador sempre que utilizarmos o .splice(), assim ele irá inserir na posição atual somada ao número de inserções. Para finalizar tudo que precisamos fazer é retornar o array convertido para string. Vejamos como fica nosso código:

function insertIntoString(str, toInsert, indexes) {  const charsArray = str.split('')
  let insertCount = 0

  for (let i = 0; i <= str.length; i++) {
    if (indexes.includes(i)) {
      charsArray.splice(i + insertCount, 0, toInsert)
      insertCount++
    }
  }

  return charsArray.join('')
}