IMO, the problem with Objective-C isn't so much massive shortcomings, as minor shortcomings (especially early on) and lack of perceived advantages.
Objective-C was a pure superset of C, so C code could transition to Objective-C easily. The mindset to use Objective-C, however, differed from the C mindset a lot. The transition from C to Objective-C is easy for code but not easy at all for many programmers. A C programmer can't easily just pick a few new convenience features in Objective-C and get better productivity almost immediately -- he needs to learn a lot of new "stuff" before he can get anywhere at all.
C++ made the transition for some code a little more difficult, but the transition for most programmers much easier. C programmers who are accustomed to dealing with every detail of their code could still do so in C++ to exactly the extent they wanted. C++ also made it easy to use some new features (e.g., adding a ctor to automatically initialize members of your struct) without really changing your way of thinking. A lot of OO purists pushed radical changes in thinking, but lots of C programmers switched to C++ without doing anything of the sort (at least right away -- and often ever, from the looks of things).
C++ also looked much more familiar to most C programmers. It added a few new keywords, but (especially early on) the code still mostly looked fairly familiar. Despite its "pure superset" status, most Objective-C code looks fairly foreign to most C programmers. A lot of C++ is also fairly easy to explain and understand in terms of how things work in C. Switching to Objective-C has a lot more places that about all you can say is "just trust me and forget everything you think you know."
Many of the design decisions in Objective-C also made it (somewhat) slower than C++, especially on relatively old machines with slow processors, limited memory, etc. Rightly or wrongly, it was also seen largely as a single-company product, where C++ was freely available for anybody and everybody to implement.
These all led to C++ being adopted quickly enough early on that it achieved "critical mass" fairly quickly, so (among other things) it became the obvious choice for a lot of projects just because it was already a widely-used, well-known quantity.
Objective-C has never reached that point. In fact, it was well on its way toward fading into obscurity when Apple revived it by nearly forcing it on anybody who wanted to develop for their systems. Apple's market share isn't large enough for that to really give it critical mass either though -- just a larger niche. It's a "default" choice only where/because Apple makes it so.
I'd also add that at least in my opinion, Objective-C's Smalltalk-like object model means that in effect it's much more a direct competitor to Java than C++. Yes, it still has the C underpinnings, and yes you can still write low-level code without using a separate language -- but pure C and real Objective-C are enough different that it's less like a single language than two completely different languages that happen to both be handled by a single compiler (though it is handy that the two can talk to each other without something like JNI to join them).