but that seems to be too slow for the TLC's to accept.
SPI doesn't normally have a minimum speed.
Did you try using shiftOut()?
I think the library does it at some point by its self.
Why do you say that? Looking at the source code I can see nowhere that is changes the speed except in the setClockDivider() function.
EDIT: You're not constantly calling SPI.begin() and SPI.end() are you?
Rob