the_author_description() must be used in the loop because it's retriving data that is set by the process of pulling a post to display. All these "loop only" functions do this. That's why they're loop only.
The Loop is essentially going through a bunch of posts (whatever posts it's displaying on the page) and setting these global variables. Then the Loop-Only functions display these variables when you want them to.
In your particular case, you're seeing it work for one reason only: The sidebar you're displaying it in happens to occur after the loop in your theme. So the data you see is the data that was set by the last post in your loop.
Your widget will be broken on a number of pages:
-Blogs with more than one poster
-Themes that have the sidebars come first in the page structure
-Pages that don't contain any posts (search results, etc)
My suggestion is not to use the_author_description() for whatever you're doing. You should use get_userdata() or get_userdatabylogin() to get back an array of info about the user you're interested in instead, and then display that. Something sorta like this:
echo "$user->first_name $user->last_name - $user->description";