In the MSCS active/active scenario, you would move the group on one node to the other node prior to applying a service pack. The only down time involved is the services going offline on the first node and coming online on the second node; the shutdown and startup time for the application. In the event of a failure, the group goes offline and comes online on the other node automagically; there is no user intervention. There is still a small amount of downtime while the services go offline and come online. This is the nature of a failover cluster with shared storage. Competative pailover clustering products suffer the same fate; it's part and parcel to the concept of failover clustering.
The other type of clustering is network load balancing. In this scenario each node runs independtly, but registers with the NLB service. NLB directs client connections to one of the nodes in the cluster. If a cluster node fails, client connections to that node are lost, NLB reconizes the node is gone, and new connections are directed to the remaining nodes. Each server hosts the complete application. There is no shared storage. Typically front end applications are load balanced, and all the front end nodes connect to the same database which is usually on a failover cluster. Application clustering by various vendors usually takes this route. Still, if you failover the backend database you will incur some downtime.
A hybrid approach adds in replication. In this approach you have NLB on the front end, and multiple backend databases where the data is replicated. This approach is harware heavy and bandwidth intensive, but it does minimize downtime. Still, there can be issues with lost transactions, conflicts, and synchroniztion.
I guess the bottom line is that you can reduce the downtime, but never really eliminate it entirely.