The Internet democratized the entire software industry by allowing developers to sell direct to customers. You would no longer have to beg CompUSA to carry your boxed software in store. Before the rise of the App Stores, you could use Kagi or eSellerate to sell your software for 8-12%, or you could use PayPal, WorldPay, 2Checkout for 2-4%. Things are even cheaper and easier now with Braintree, Stripe, etc.
Apple charges 30% because they can, just like how CompUSA could charge whatever they wanted and make you pay for boxing and associated costs, because the software you spent a year writing cannot be sold anywhere else except on their platform. And if you want to sell by yourself on the Mac, without using the Mac App Store, you are a second class citizen because certain APIs like the iCloud SDK are not available to you.
If the $99 is a nominal amount, why even charge it? Why $99 and not $49? Or $199? Again, it's a number they came up with which they felt a certain demographic, let's say teenage programmers could afford, or younger kids could get their parents to pay for. I'm open to better reasons if you have one.
Being experienced in many languages does not make one a good programmer. You can be the jack of all trades and master of none. You think someone can just pick up C++ in a few weeks and become an "expert"? It takes years to become proficient in not only a single language but it's associated tooling and ecosystem.
I have no doubt that there are many developers out there who have spent years of effort learning Apple's proprietary stack and are now regretting it and kicking themselves because a decade has passed and Apple, as a friend to developers, has regressed and gone backwards.
Finally, Cocoa is a nice enough API, but have you ever had a problem and then tried to resolve it? Good luck going to the sign-in Apple developer forums where everyone shouts "ssh, we can't talk about it, it's under NDA" or having to file a bug report on Radar where nobody even responds and when they do it's to say it's a duplicate bug filing or, or opening a DTS incident and having the person say "Yep, it's a bug on our end, not sure when it will be fixed, in the mean time try a workaround". How is this better than having an open roadmap with discussion in public forums regarding language/SDK features, bugs, fixes etc?