Reading your question, I remember thinking the exact same thing when I read the chapter. Even with the use of decorators, you're still going to have to add a lot of code whenever you add a new beverage to the menu.
There's also the matter that there isn't really much difference among the beverages. Mochas, dark roasts, decafs and so on just aren't different enough to justify defining a whole new class for each one. As far as the business of the coffee shop is concerned, the drinks don't differ in behaviour; they differ only when it comes to properties: name, size, condiments, price, discount and so on. "Same behaviour, differing properties" is a hint that those objects should probably be of the same class.
A real-world chain of cafes isn't going to tolerate a code update every time they add a new drink to the menu or change the prices of existing drinks (because real-world economics make real-world coffee prices fluctuate). foosion's right: the real-world way to implement this is to use an approach that's more data-driven. Adding a drink to the menu should be done by adding a new row to the data table. Changing prices for a drink should be done by changing the "price" column for that drink.
As for the use of the "Starbuzz Coffee" example in Head First Design Patterns, it was probably used because one of the cardinal rules of the Head First series is that its content be interesting and fun, and the authors probably felt that the equipment inventory example for decorators in the Gang of Four book would bore their readers.
[Edit: Wouldn't you know it -- someone beat me to the punch by five years, saying pretty much the same thing -- see Ravi Venkataraman's comment to this article.]