No pętla się wykonuję jeśli znak nie jest 0 lub znak nie jest X.
skoro w danym momencie zmienna przyjmuję tylko jedną wartość to nie przyjmuję drugiej więc warunek zawsze jest sprawdzony.
Lepiej według mnie takie coś zrobić zwykłym breakiem
znak_gracza = None
znak_pc = None
while True:
znak_gracza = input('Chcesz grac jako "O" czy "X": ')
if znak_gracza == 'O':
znak_pc = 'X'
elif znak_gracza == 'X':
znak_pc = 'O'
else: print('Podano zly znak')
if znak_pc is not None: break