scater::runNMF just defers to the NMF package, which seems to be quite slow compared to, e.g., the usual PCA algorithms. Fiddling with the different method= options doesn't really help, I'm afraid.
We used to use NNLM, which was much faster... but that got kicked off CRAN. If I can find the motivation, I may just transplant the code into scater. Not the best solution, but that's how it is.