You almost always want to use at least NSWindowController. This is a key part of Model-View-Controller: rely on your controllers to glue your GUI objects together, and to the model itself. In most non-trivial applications NSViewController is going to be a very useful way to subdivide the controller responsibilities for an application. You are going to have a view hierarchy of some sort, but you always want to have controllers supporting that.
Consider Xcode. It almost certainly has an NSWindowController, and then each of the inspectors is likely an NSViewController. I would even bet that most inspectors are composed of multiple NSViewControllers stacked together.
As for documents and controllers, in simpler apps the NSDocument can act as the window controller; this is how we use it in the book. In more advanced apps, you will want to create an NSWindowController, and connect it to the NSDocument. This is a bit beyond the scope of a beginner Cocoa book, but the place to do this (and a good starting point for learning more about it) is NSDocument’s -makeWindowControllers. This is discussed in the Cocoa documentation.
If you’re getting all of this, great, but if you’re not, start small and work your way up. It can be pretty daunting to apply these design concepts when you’re starting out.