Oi, Edson! Tudo bem?
O que acontece é que no seu loop for você está chamando o replace() toda vez na variável secretWord, e definindo que a cópia vai sempre ser o retorno desse replace(). O problema é que o replace() não muda a string no local, mas retorna outra string. Vamos simular isso passo a passo pra ficar mais claro:
No primeiro loop:
secretWord == apple
secretWord_copy == _pple
Segundo loop:
secretWord == apple
secretWord_copy == a_ple
Porque a cópia sempre vai se basear na secretWord, entende?
Existem algumas formas que podem simplificar bastante o código e não trazer esse problema. Um exemplo é simplesmente ter uma string com '_ ' multiplicado pelo comprimento da secretWord:
secretWord_copy = '_ ' * len(secretWord)
print(secretWord_copy)
E o resultado:
_ _ _ _ _
O que acha?
Abraços e bons estudos!