On the one hand, hardcore theoretical courses at the average CS school don't exist as weed-out at all. If you're lucky, you've got a good faculty member teaching a compilers or operating systems course that'll make it challenging, but only sometimes. Teaching things like Haskell, The Lambda Calculus, Prolog, Complexity Theory and C are "impractical" for someone doing a CS degree, because, you know, everyone uses "OO" (whatever that means) nowadays so that's the theory we should teach. Plus, if we teach a hard course about the theory of computation, lots of kids will flunk, and we can't have that, now can we?
On the other hand, any attempt to make the curriculum practical (since most schools border on vocational training anyway) is met with the response of "Well, a CS degree shouldn't prepare you to be an industry programmer!"
So really, most universities are left in a luke-warm middle-ground, where theory is being neglected but no one is willing to be the administrator who "flips the switch" and turns CS students into non-stop code monkeys.
Really, grounding yourself in a lot of CS theory, while occasionally forcing yourself to break out and hack up a project, is probably the best route to becoming a well-rounded programmer. Whether most people are capable of realizing how bad current CS education is and doing so, however, is another matter.