I’ll try to explain crudely what I understand of wikitext rendering, but there will be approximations and imprecision, please bear with me 
As far as I can tell, your initial code isn’t working because macros are just “text snippets” with a name, they are not “computed” ( = rendered) until after they are used.
When a tiddler is displayed, during the first pass of the rendering process, macro calls are replaced with their definition (ie. the <<macro name>>
is replaced by the macro’s content), and in a later pass the widgets (like <$list>
) are rendered (ie. replaced by html + css).
In your code, when the macro is called in the filter, during the first pass the content of the macro definition is inserted into the filter, just like if you’d written this:
<$list filter="[search:title:literal[T:{{!!Jahr}}{{!!Monat}}]]">
which doesn’t work because it’s not a valid filter syntax.
In order to solve this problem, you can use a function instead of a macro, because a function is a “custom filter”, which TW’s rendering process recognizes and treats as such.
There are other options, like using a variable initialized with the result of a “filtered transclusion” like this:
<$let Suche={{{ [[T:]] [{!!Jahr}] [{!!Monat}] +[join[]] }}}
Suche: <<Suche>>
<$list filter="[search:title:literal<Suche>]">
</$list>
</$let>
(untested code)
Fred