Was mir in solchen Fällen schon aus der Patsche geholfen hat, ist eine CSS-Helperklasse.
Je nach Kontext etwas hackig aber hilfreich, wenn man nicht immer das ganze Markup mit a-Tags wrappen möchte, Beispielsweise wegen Screenreadern. Oder als Hotfix, der sich leicht wieder entfernen lässt. 
Nachteil: Text lässt sich nicht mehr ohne weiteres markieren.
Dabei muss das Bild nicht separat verlinkt oder im gleichen a-Tag ausgegeben werden, sondern es wird ein Teil vom a-Tag (bzw. das Pseudoelement darin) über das Elternelement gespannt.
Demo auf Codepen
HTML
HTML-Code:
<ul>
...
<li class="cover">
<img src="example.jpg" alt="" width="640" height="425">
<a href="#" class="cover__item">Excepturi, voluptatum.</a>
</li>
...
</ul>
CSS
Code:
:where(.cover) {
position: relative;
}
:where(.cover__item)::after,
:where(.cover__item-before)::before {
content: '';
position: absolute;
inset: 0;
z-index: 1;
}
Twig
Code:
{% extends "@Contao/content_element/downloads.html.twig" %}
{% use "@Contao/component/_download.html.twig" %}
{% set download_link_attributes = attrs(download_link_attributes|default).addClass('cover__item') %}
{% block list_item_attributes %}{{ attrs(parent()|default).addClass('cover') }}{% endblock %}