Perché ti aspetti qualcosa di diverso? Stai facendo partire i due thread praticamente insieme, nel momento in cui chiami la join con ogni probabilità entrambi i thread sono già terminati. (tra l'altro, potresti anche ottenere BARFOO o qualunque mescolanza dei caratteri, dato che non hai locking explicito)
Distruttore di che oggetto? Comunque, se hai un oggetto allocato nel thread principale ma usato nei thread, e questo esce di scope (per terminazione del main) è normale ottenere un errore.Inoltre ho notato che se semplicemente associo un thread ad una funzione il programma genera una active exception quando viene chiamato il distruttore.
I thread partono al momento della creazione degli oggetti-thread; a differenza di altre librerie di threading, i thread C++11 (così come i thread Boost) partono immediatamente.
Cercando una soluzione ho trovato un altro "comportamento" strano: se commento le righe nelle quali eseguo le join mi stampa a video sempre "FOOBAR" anche se non chiamo mai le due funzioni.