A sub-flow acts like a macro: execution wise, it's as if the elements of the sub-flow were copied in the calling flow.
Thus it's the threading behaviour of the calling flow that will determine the threading behaviour of the sub-flow.
Whether they're used in sub-flows or main flows, you should write your component classes to be thread safe if you use singleton instances of them (the common use case). If you use prototype instances (one instance created per request) or pooled instances (limited number of instances, bottlenecks the threads), your component classes can be thread unsafe.
As a rule of thumb, strive for thread-safe stateless component classes as much as you can to save you potential optimization pain down the road.