Is it OK to create a UIViewController on a background thread?

It depends on what the instance variables are actually doing. General rule is that the code running by a background thread should not trigger any UI updates such as view.addSubview(..) or view.setNeedsLayout etc, then it is safe to play around with a view controller using a background thread.

Another example would be navigation controllers. For instance, once a view controller was pushed onto a navigation stack, even updating viewController.title can be dangerous so you should make sure viewController.myProperty = true doesn't trigger any UI updates. Personally, I would do the following assignments in the main thread to feel safe:

dispatch_async(dispatch_get_main_queue(), {
  viewController.title = "My Title"
  viewController.myProperty = true
  ...
})

Long story short, you can initialize new UIView or UIViewController (or any UIResponder) in a background thread however, you should be changing any of its properties triggering UI updates within main thread. So create in background but update in main thread.