There is no magic there 
To be able to pass additional attribute to Loss we need to set the output in format (prediction, target, kwargs) as according to the docs 2:

output_transform (callable): a callable that is used to transform the
:class:~ignite.engine.Engine's process_function's output into the
form expected by the metric.
This can be useful if, for example, you have a multi-output model and
you want to compute the metric with respect to one of the outputs.
The output is expected to be a tuple (prediction, target) or
(prediction, target, kwargs) where kwargs is a dictionary of extra
keywords arguments. If extra keywords arguments are provided they are passed to loss_fn.

You can also see how it is interpreted in the update function: https://pytorch.org/ignite/_modules/ignite/metrics/loss.html#Loss 2
Therefore, eval_fn as being engine’s processing function returns the output exactly in the good format for the Loss function.
For other metrics, you need to filter out the last element (dict) with output_transform and attach to this evaluator (no need another one):
acc = Accuracy(output_transform=lambda out: out[0], out[1])
acc.attach(evaluator, "Accuracy")