JavaFX usa lo stesso paradigma e la medesima filosofia che c'è anche in Swing. Esiste un singolo thread specifico che si occupa del disegno della interfaccia utente e degli eventi. L'accesso ai componenti, layout ecc.. va fatto SOLO nel contesto di questo thread specifico. Non nel contesto di un altro "tuo" thread.
Swing non fa controlli in tal senso, JavaFX invece è più pignolo, li fa e causa appunto un IllegalStateException.
Semplicemente devi fare "passare" un pezzetto di codice nel JavaFX application thread usando il Platform.runLater