a!arg is used because I hated the look of a<arg> used in C++. (Using < > to bracket things when < means less than and > means greater than is always trying to short-circuit my brain.)
What makes the choice of < > for template parameter bad appears when someone tries to nest templates.
a<b<arg>>
and now a means greater becomes a shift right.
That's one of the reason that it you had a genious ideo to find domething else in D
a(template params)(runtime params) at declaration
a!(template params)(runtime params) at invocation with the type deduction and parenthesis omission making often even disappear completely the template syntax.