Lascia stare il while e i thread se è solo quello il problema. Usa gli eventi, per esempio se il giocatore interagisce con il gioco tramite pulsanti avrai:

codice:
protected void Button1_OnClick(object sender, EventArgs e)
{
   Gioca(1);
}
protected void Button2_OnClick(object sender, EventArgs e)
{
   Gioca(2);
}
//e via dicendo...Non è il miglior modo ma per ora va bene cosi

//qui la logica del gioco... di regola dovrebbe essere in una classe a parte. Ma questo è un altro discorso.
//In ogni modo questa funzione non è in un while ma viene chiamata solo ogni volta che il player esegue una mossa.
public void Gioca(int mossaPlayer)
{
     if (!ThereIsAWinner)
        GiocoIo(mossaPlayer);

    if (!ThereIsAWinner)
        GiocaIlComputer();

    if (ThereIsAWinner)
    {
        MessageBox.Show("HA VINTO: " + WhoIsTheWinner() + "!");
        ResettaAlloStatoIniziale();
    }
}
EDIT:
ovviamente non per smentire U235. Puoi sempre usare i thread se vuoi ma ho come l'impressione che questa tua idea di usare il while (che ti costringe poi a maneggiare i thread), giusta in caso di ConsoleApplication, sia solo un retaggio di un modo di programmare per Console Application.