It's not great but I usually do something like this:
cat(..., file=stderr())
You'll then have to track down the log file where the application is sending its standard-error. In a stock shiny server deployment I believe this is in /var/log/shiny-server. Each R process gets a different file. (If an R process exits gracefully, its log file is automatically deleted; if it exits with a non-zero exit code then the log file is kept.)
You can do "tail -f path-to-logfile" on the server to see the output in realtime.
It would probably be a good idea to make it very simple to log to the JavaScript console though. Maybe like a session$log().