Como resolver?

O ponto chave é encontrar uma forma de calcular quanto de cada moeda utilizar e armazenar esses valores referentes a quantidade de cada moeda. Uma forma que já utilizamos e podemos aplicar nesse desafio é utilizando objetos.

Resolução

Como sugerido, podemos usar objetos para armazenar a quantidade de cada moeda a ser retornada. Além disso, podemos utilizar a operação de divisão para descobrir quantas moedas utilizar, pois o quociente da divisão representa a quantidade de moedas (Ex.: Em 318 / 100, o quociente é 3 e o resto 18). No entanto, ao utilizar a divisão precisamos nos certificar de pegar apenas a parte inteira, e para isso podemos utilizar o Math.floor() do próprio javascript, que pega o primeiro inteiro anterior a um número. Um último ponto para nos atentarmos é a questão de utilizar o máximo possível de moedas de alto valor, portanto precisamos fazer todos os cálculos em uma ordem específica, nesse caso em ordem decrescente. Vejamos como ficará o código:

function creditCoins(num) {  let rest = num
  const coins = { '500': 0, '100': 0, '25': 0, '10': 0, '5': 0, '1': 0 }

  coins['500'] = Math.floor(rest / 500)
  rest -= 500 * Math.floor(rest / 500)

  coins['100'] = Math.floor(rest / 100)
  rest -= 100 * Math.floor(rest / 100)

  coins['25'] = Math.floor(rest / 25)
  rest -= 25 * Math.floor(rest / 25)

  coins['10'] = Math.floor(rest / 10)
  rest -= 10 * Math.floor(rest / 10)

  coins['5'] = Math.floor(rest / 5)
  rest -= 5 * Math.floor(rest / 5)

  coins['1'] = Math.floor(rest / 1)
  rest -= 1 * Math.floor(rest / 1)

  return coins
}