Right, HttpContext.Items is just a place to store things for the lifetime of the current request and is faster than acccessing items from cache so we use it for things that might get looked up in multiple places in code or controls during a given request so that the first time it is looked up either from the db or from cache it is then stored in Context.Items and the next thing that wants to access it gets it from there so we never lookup the object from the db or cache more than once during a given web page request.
ie SiteUtils.GetCurrentUser may be called in a bunch of places in code during a request but the first time it is stored in Context.Items so we don't hit the db for it more than once during a request.
SiteSettings is similar but it is a little more expensive object and also used even more frequently so we cache it for about 5 minutes at a time, but the first time we get it from cache we keep it in Context.Items because it will be used lots of places during a given request and accessing Context.Items is much faster than accessing the cache over and over during the request.
Caching uses server memory which is usually a very precious resource so you don't want to go hog wild caching things, ie we don't cache SiteUser because with a lot of users that would gobble up memory. If memory usage reaches limits set on the app pool it causes the app to recycle frequently which hurts performance.
Hope that helps,
Joe