While realmente é uma solução simples nesse caso.
Outra forma que teria de fazer seria criar uma função para pegar o nível, e retornar à função caso o nível fosse inválido.
Ex:
def get_nivel():
nivel = int(input("Digite um nível: "))
if (nivel == 1):
tentativas = 20
pass
elif (nivel == 2):
tentativas = 10
pass
elif (nivel == 3):
tentativas = 5
pass
else:
print("Digite uma opção válida.")
return get_nivel()
get_nivel()
Esse é exemplo de uma função recursiva. Apesar de que, de forma geral é bom evitar funções recursivas onde não forem necessárias. Uma função recursiva mal escrita pode gerar o famoso "stack overflow". Uma alternativa para essa recursão seria fazer a tratativa do resultado da função fora da função retornando True ou False, e usando um laço como você fez com o while. Por exemplo:
def get_nivel():
nivel = int(input("Digite um nível: "))
if (nivel == 1):
tentativas = 20
return True
elif (nivel == 2):
tentativas = 10
return True
elif (nivel == 3):
tentativas = 5
return True
else:
print("Digite uma opção válida.")
return False
validateInput = False
while not validateInput:
validateInput = get_nivel()
Nesse caso em específico você se resolveu bem com while já, mas como a tendência em códigos mais extensos/complexos é que se foque em chamada de funções, e a manipulação de retornos de função para decidir a validade do resultado obtido, talvez esse tipo de solução venha a ser útil.