An update:
I have discovered that it was a combination of issues: first, the USB reset pin needed to be set to match the official TUSB2046b timings, of about 200us-1ms. I fixed that, got the hub to enumerate, but it was reporting that it didn't have any ports. This was due to a bad hub. Now, I have a new board with a new hub and correct timings on the USB reset pin, and I can get the hub to work. It also detects the attachment of my device. However, this leads me to a new problem...
I'm running the bare metal USB Host example for the K60f, with the tweaks necessary to drive the USB reset pin and to match my clocks. Another application with identical settings functions correctly under these settings, but it does not use the USB. After the USB device connects to a downstream port on the hub, I can see the hub state machine transition to the HUB_ADDRESS_DEVICE_PORT_PROCESS. This happens reliably when the device is attached, provided it wasn't previously attached and removed. It then goes through the device attachment just fine, enumerates it, then continues running. After this, it picks up messages and rolls on to TR_MSG_RECV in khci.c, where every message is a NAK.
The USB device is an Arduino-based sensor that sends its information string once every second. It functions correctly on a PC, and the virtual serial port on the PC at 115200 baud shows the data correctly.
So, the device works on a PC, and it shows up and is enumerated on the K60f. I don't appear to be getting the data that the device sends, nor does it look like it's applying the driver to recognize that it's a USB CDC ACM interface that it needs to use. Any ideas?