The function might have some internal state, like variables or helper functions. I don't want those to clutter up the namespace, nor do I want them to be mucked up by other code.
I used to have top-level (let ...) forms here and there for exactly the reasons you described, but sooner or later I regretted not being able to view those values at the REPL during debugging. For instance, Lathe's 'multival-cache* [1] is an implementation detail for the multival framework (which I won't go into here), but it turns out to be really useful to inspect when the framework goes awry.
In any case, I welcome the ability for people to muck with my code, 'cause it's a good way to experiment with making it better. ^_^ Just because something's exposed doesn't mean it's part of a stable API, especially in Arc where things are assumed unstable by default.
Cluttering up the namespace is still an issue, but the obvious advice is to choose unique names. ;) If you're still very worried about it, like I am, I humbly suggest you look at Lathe's namespace system.