I can't easily track down the issue, but I do notice that there's a
workaround possible by using .attr("files.0") instead of .attr("files.length").
This isn't a substitute for fixing the bug, but it is something
that I've noticed in binding, that sometimes a particular binding on a
list responds correctly to changes in length but not the update of
individual members, and sometimes vice versa.
I can't speak for CanJS 2.1, but in 2.0 I noticed this dichotomy
before in using {{#each list}} vs {{#list}} for live-bound rendering
of a can.List in a Mustache.