Você não pode. Barras invertidas não podem aparecer dentro das chaves {}; fazer isso resulta em SyntaxError:
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
Isso é especificado no PEP para f-strings:
As barras invertidas podem não aparecer dentro das partes da expressão das strings f, [...]
Uma opção é atribuir '\n'a um nome e depois .joindentro da f-string; ou seja, sem usar um literal:
names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)
Resulta em:
Winners are:
Adam
Bob
Cyril
Outra opção, conforme especificado por @wim, é usar chr(10)para obter o \nretorno e, em seguida, ingressar nele.f"Winners are:\n{chr(10).join(names)}"
Outra, é claro, é '\n'.joinantes e depois adicionar o nome de acordo:
n = "\n".join(names)
text = f"Winners are:\n{n}"
que resulta na mesma saída.
Nota:
Esta é uma das pequenas diferenças entre f-strings e str.format. No último, você sempre pode usar pontuação concedida que um ditado maluco correspondente é descompactado que contém essas chaves:
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
(Por favor, não faça isso.)
No primeiro caso, a pontuação não é permitida porque você não pode ter identificadores que os utilizem.
À parte: eu definitivamente optaria por printou format, como as outras respostas sugerem como alternativa. As opções que dei se aplicam apenas se você precisar, por algum motivo, usar strings f.
Só porque algo é novo, não significa que você deva tentar fazer tudo com ele ;-)
f"Winners are:\n{chr(10).join(names)}"