The loops are still possible. Look at this two questions (by the same author, but that's not really important; timing is the key):
Being one of those who voted, I can explain what happened:
Both questions were voted as duplicates of each other. However 1 got closed before 2.
I wanted to vote "close" on 2, but the "duplicate" reason was unavailable. It didn't matter, since I wanted to pick the usual "no effort" reason (I checked if the "duplicate" was available purely out of curiosity).
The key thing is: it already had 3 "duplicate" reason votes.
TZakrevskiy voted after me, presumably also as "no effort", so the final result was 5 closing votes:
- 3 votes for "duplicate of 1" (which was already closed as "duplicate" of 2"); and
- 2 votes for other reasons.
Since 3 > 2, the published reason is "duplicate of 1".
Some of the possible solutions:
Display all of the closing reasons (this would generally be a good idea), omitting "duplicate" in the latest-closed question if circular duplicity occurs.
Detect loops and cancel "duplicate of X" votes if X gets closed as a duplicate of the question being observed.
Personally, I prefer solution 2, but I also think that the "display all close reasons" should be implemented regardless of this problem.
I have just noticed that the author has deleted the question from the first link. So, the second one now has a notice that it was closed because it is a duplicate of the first one, with a link to the "This question was deleted by the author" page. I think that this kind of deletes should also be handled in some better way.