Hi Henrik,
First, as a general best practice, make sure that any time you are referencing an image you have uploaded in Studio, you use the static asset URL so that browsers can benefit from our CDN. This is simple using FreeMarker in your custom components and skins.
Normally, optimizing caching involves deciding how you want the browser cache and the CDN cache (which, here, sits in between the browser and the community) to work. Then, like you said, there are a few HTTP response headers that can be used to tweak the specific behavior.
We don't provide a large amount of configuration for those cache-related parameters today, but we try to be smart with the headers. We serve all images and other static assets with "Expires" cache headers. In most cases, this is 24 hours in the future, which is a common best practice for expiration. Uploaded user images and attachments get a shorter time to live (TTL) because they are subject to moderation and privacy settings. If the image is supposed to go away, we want it to go away sooner than later.
We also serve proper "Etag" and "Last-Modified" headers, which can be useful for letting browsers know whether they need to download the latest version of an image or use a cached copy.
Finally, we serve "Cache-Control" headers that advise the CDN to force an update a least every once in a while. For skin images, that is usually around 12 hours. For user-uploaded images, that's 5 minutes (reasoning explained above). This header is to be obeyed by the CDN and generally does not affect the end user experience at all.
Of course, any feedback is always appreciated about specific assets that are a problem for you.
Andrew