So if traits need to be impl'd just for the purpose of calling a function (i.e. they don't have any other purpose in your lib), I think using functions/closures is more straightforward. Callers can use your canned versions or write a custom one.
Also, your original code has trait A and A1: A, with A1 providing a default impl. Just wanted to point out, in case this was lost, that your callers will need to impl A as well if they decide to impl A1 - there's no inheritance/type hierarchy there. Then you end up with an impl that requires UFCS to resolve which "a" you want to call, and it's confusing for the caller as well I think.