I most often use it when I have a question about what a piece of code does in situations that aren't covered by the documentation. For example, I used to reflect A LOT when first attempting to create complex web controls for the old ASP.NET webforms model. That whole callstack is horribly complex and the documentation isn't the friendliest...
Probably the #1 reason why I use reflector now is to see what exceptions a call may throw. One of the biggest failings of the .net docs is that it generally only tells you what the current method throws in the way of exceptions. For example, if method A may throw exception 1, and method A calls method B which may throw exception 2, you'll only be told about exception 1 in the docs for method A. Sometimes you won't even get that with ArgumentNullExceptions.
One of the coolest reasons why I used reflector was when I wanted to create a DynamicMethod. DynamicMethods let you construct a method via IL calls; its inbetween reflection (slow) and compiling your own assembly in memory (fast execution but slow startup). I wanted to create a little class that checked to see if an event was fired during a test... Anyhow, I had no idea how to code IL, so what I did was create an assembly with a class that did exactly what I wanted to do in the DynamicMethod, compiled it, then viewed the IL in Reflector. That was a satisfying exercise in and of itself, and I may use the same techniques to do some more complex statement parsing/compiling down the road...