I've found that busy loops often take up more processing even with the sleep. You can check if this is the case through JVisualVM. Disable the busy loop and look at the CPU usage. Then enable the busy loop. I believe the overall % of use will be raised. With a JavaFX SchedulerService, I think you'll find the usage "bursty" but in line with what you actually expect.
Also, I haven't seen your Controller, but be aware that runLater() doesn't mean that the UI update will run now. I've seen these runLater() s stack up and only be executed after the long running process. The screen waits and then a flood of updates come in, effectively zooming to 100%. updateProgress / Message have been more reliable for me.