Hosting and Domains don't really come into this discussion as they are fixed costs that the customer has to pay for anyway.
Within the context of this discussion, it really is no different than buying a car from a car yard.
You can either pay annually for mechanical insurance, and get your car fixed and regularly maintained under that insurance. Or you can pay by the hour to have the same work done as and when you require. Which option is cheaper in the long term is dependent on the reliability of the car, and how picky you are as the owner.
What I have learned to avoid (through hard lessons) is upgrading code base like Silverstripe for clients for free. It takes your time to do and my clients have 3 options:
1. Pay an annual fee to keep their site on the latest and greatest source code. In my case, this also covers answering the simple email and phone queries they have in a timely manner. Some clients do this.
2. Pay for my time to do all of the above on an as-need basis. This is what most accountants or lawyers will do. Most clients do this and learn to curtail trivial requests when they realise a web developer's time isn't free.
3. Leave code and site as is - Only a few go for this option on a brand new site.
There are special instances where I will manage upgrades for free. Like a major security hole that is in my interest to plug, not least because I recommended SS. But I have simply found that if you get yourself in a position of doing freebies for clients too often, they often expect the same time and time again.
Really this can be configured anyway that works for you, and is financially viable. E.G. Spend $XX,XXX and get one year's free upgrade maintenance - After that the cost is $XX per month. (Car yards do this on brand new cars) Make different levels of support contracts if you like (But I would steer clear of the complexities of managing this if you are freelancing).
It's really up to you, the type of clients you deal with, the type of services you off, and your local market really.