A loop would not work like you expect. Take this psuedo code.
Code:
for (int i =0; i < 100; i++) {
[mySound setVolume:i];
}
This will execute in an almost imperceptible amount of time, making the fade barely noticeable. You could insert some sort of sleep in there, but then you are just tieing up your main application thread doing nothing.
You can tell the timer to fire 20 times per second and step the volume down, or up, a little bit each time. A loop doesn't give you that same level of control over time.