Historically, the Google apps that exist in Android like Gmail, Gtalk, Google+, etc are tightly tied to the Android OS version. Therefore, upgrades to these applications generally did not happen outside of a full-blown Android OS update. In the beginning, this probably did not present much of a problem because there were few carriers and few handsets. Now that Android has deposed the iPhone as the most widely used smartphone on the planet, there are lots of carriers, lots of handset, and lots of problems keeping everything updated.
The basic problem is the cell phone carriers. In a typical computer world, the vendor just updates your software when they want. Consider the never-ending Windows updates or the magically appearing iOS updates. There is no middle man, updates just happen. In the Android world, the carriers are the middle man and they do not allow OS level updates without testing and certifying the version to be sure it will work on their network and not cause their users problems. This takes a lot of time (meaning money) and the carrier isn't going to ever get that money back from their customers or Google, so there is very little incentive for them to go through this certification process and push the update out. They tend to just let handsets rot at the level they were purchased at and it is very common to wait literally years for an Android update to be allowed through your carrier.
This table shows that the vast majority of Android handsets are sitting at version 2.3.3 which was released in early 2011. The current version is 4.1.2 and as far as I know, no carrier has pushed that out yet.
So Google effectively has their hands tied by the carriers. Google can put as much love and care into their apps as they want, but the general Android community may not see them for years. This is the problem that Google is seeking to solve by decoupling their apps from the Android OS updates. By treating their apps as apps instead of OS components, things like Google+, GTalk, Gmail, Navigation, etc, can be updated quickly and automatically from the Google Play store just like any other application on the phone. This means that updates to applications can actually hit the end-users' handsets overnight because the carriers do not care or certify application level updates. They just let them happen.
That's all well and good and the problem is now solved. But let's get back to my original question: how did Google end up in this mess? The technical explanation is easy - I've explained that above. The business and modelling decision is much more difficult to explain. For years (decades, maybe?) both sysadmins and developers have been madly abstracting processes of all kinds to make them less dependent on each other. Sysadmins have been adding load balancers in front of servers to abstract things like SSL termination and traffic maintenance. Developers have been using things like the Model/View/Controller (MVC) framework to develop their apps to keep their data abstracted from the GUI. Abstraction and separation are proven concepts used throughout the technical world and have been adopted everywhere possible because it prevents the dependencies that caused this precise problem. It's amazing to me that such a technically savvy company would decide from day one to bundle their apps into the OS given that this turns its back on years of proven processes.
To be fair, I doubt that Google anticipated how lazy the carriers would be about their OS updates. At the very least, it's reasonable to assume that a carrier would want to get security updates onto their customers' handsets so that they don't have malware running on their network, but that's evidently not the case. Given the statistics, it seems that almost no carriers have bothered to allow an update in over two years which probably caught Google by surprise. And, since Google has no leverage on the carriers, the annoyance became a big problem.
So what's the lesson kids? Separation, separation, separation! It doesn't matter if you're coding or hacking, break as many dependencies as you can so that your app/network is as flexible as possible. That's the only way to protect against unforseen actions by third parties.