Supondo que você quer um proxy reverso, você pode usar o Varnish no modo saint ou o squid com a diretiva stale-if-error.
Se você quiser cache no aplicativo, usando memcached por exemplo, apenas não confie no mecanismo de expiração de armazenamento - expira o prazo com o objeto em cache array(cached_object=>object, expiry=>timestamp)
e reaja se encontrar um cache obsoleto: aumente a validade para agora + um pouco de time (para evitar o dogpiling - vários processos gerando novamente o cache em paralelo), use o cache antigo, inicialize a atualização.