I had the same problem, and these were my findings, all personal theories about how this works, which could be wrong:
The "empty:"'s are to for the r.js optimizer to bypass those modules and load the corresponding webjars from the CDN at runtime. It works well with regular modules but I've found it breaks with requireJS plugins. I've tested that outside of Play with a minimal web app (just requiring the text plugin with an "empty:" path) and it also breaks, so it seems it's not Play's fault.
In my experiments, I could avoid using a CDN by overriding RjsKeys.buildProfile, but then I stumbled across another problem. If the template file used through the text plugin (say 'text!foobar.html) is not a valid css or js file, then r.js won't find it under target/web/rjs/appdir and so we've got another problem. One kludge to solve that would be to run a custom pipeline task before rjs to place those files somewhere in the target dir...
--Alejandro