It looks as if you simply didn't finish writing the intended rule,
RewriteRule ^(dashboard)($|/) - [L]
I can't do it for you because, among other things, only you know what you're rewriting
to:
/private/dashboard/rest-of-path
or
/private/rest-of-path
or something else again. In any case, requests for example.com/dashboard without trailing slash will need an explicit redirect, which will have to be listed separately before the rewrite. (Search engines
will ask for this form, and you can't leave it up to mod_dir because it isn't a real, physical directory.)
What happens if someone explicitly requests example.com/public/ or, for that matter, example.com/private/ ? I don't understand what prevents an infinite loop: example.com/public/public/public/public/ until the server gives up and throws a 500-class error.
Incidentally...
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
Why are there two rules? The form .* alone includes ^$ and there doesn't seem to be any special handling required, so it can all be expressed in a single rule if you've previously intercepted /dashboard/.
Oh, and do please put a / at the front of each target. It keeps malign robots from doing, er, whatever it is that malign robots do when given half a chance.
Edit: redirect it to the /private directory
I'm assuming the word "redirect" here was simply a mistake.