NSArray doesn't store the strings themselves in your example. It stores pointers to the strings. arrayWithCapacity allocates at least enough storage to store those 200 pointers. But that doesn't mean 200*sizeof(pointer) either. NSArray does not promise contiguous storage. It may store its pointers any way it likes, and it can change its mind and reorganize itself at runtime if it likes. So it allocates "enough that it doesn't need to grow before you add 200 objects."
If you want to explore the current details (subject to change) of the underlying data structure, see the CFArray source code. If you want more discussion on the subject of NSArray performance, see Array from fish.
Just to throw another little wrinkle, in some cases strings are short enough that they get encoded directly into the pointer itself. (This is also done for numbers.) See Tagged Pointer Strings by Mike Ash for a nice intro to that. So sometimes the pointer is the whole object and nothing else is allocated.
Basically, many intuitions you bring from C++ don't apply to Cocoa. C++ encourages you to think very carefully about how things are implemented under the covers. Cocoa encourages you to just write to the API and trust that Apple will make it performant for most common use cases on their platforms. If you try to second-guess Apple, you can easily get burned when the underlying implementation changes. (Of course sometimes you have to dig into the details to fix a performance problem; it's just not encouraged at every stage the way it often is in C++.)