– Синхронно.

Этот вопрос аналогичен вопросу о Handler.post(). Handler.post() выполняется асинхронно и для синхронного выполнения предлагается проверять текущий поток. В runOnUiThread() есть эта проверка.
Если текущий поток – это UI тред, то параметр-runnable запускается сразу. Иначе выполнение делегируется в mHandler.post(), где mHandler – это хэндлер, созданный на UI потоке.