It is absolutely true that a nib file does NOTHING for you that you couldn't have done, somehow, in code! And indeed, in particular cases, deciding between using a nib file and just creating those instances, in code, can be a tough decision. Nevertheless, at least sometimes, a nib file can be more convenient.
Think of Interface Builder as another way of creating instances. A nib file consists (in your imagination) of class names (such as UIWindow, UIView, UIButton, whatever) along with instructions for how to instantiate these classes and configure the instances (e.g. make this UIButton a Round Rect with the title "Tap Me!").
At some point, if and when the nib is loaded, all those instances are actually created.
So a nib file is a good way to configure a bunch of instances, graphically (especially useful, obviously, when they are UIView subclasses), and bring them all to life in one fell swoop by loading the nib. If you have a big object graph - a UIView full of buttons and fields and stuff - designing and configuring in the nib file makes your code a lot simpler and more maintainable.
Moreover you can load the same nib over and over to get new instances. This is why e.g. designing a UITableViewCell in a nib is such a great approach.