One option is to send them through a PHP script and have that script out caching headers for you. It accomplishes the same thing with only a little extra overhead for having to have PHP serve the image as a proxy.
Example:
HTML:
<img src="/images/img.php?img=someimage.png">
PHP:
<?php
$filename = $_GET['img'];
$file = '/path/to/file/' . $filename;
// Do verification that the file exists, they're not after any secure
// files, etc. Not shown here
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header("Last-Modified: " . date( "D, j M Y H:i:s", strtotime("- 1 month")));
header("Expires: Thu, 20 Sep 2012 05:00:00 GMT");
header("Cache-Control: max-age=2692000, public");
header("Pragma: cache");
ob_clean();
flush();
readfile($file);
exit;
?>