It seems that Fuse applies memory contention to I/O accesses to odd numbered ports from $4000-$7fff for +2A / +3 emulation. Since the +2A and +3 make use of MREQ, it seems unlikely that they would intentionally apply memory contention to port accesses.
Even numbered ports would obviously still be contended, and I'm not sure whether this would use a different contention pattern, given that contention is drastically different on the +2A / +3, anyway.
Apologies, I've misread the code. ula_contend_port_early() and ula_contend_port_late() both use ula_contention_no_mreq[]. For +2A and +3 emulation, machine_reset() populates this using spectrum_contend_delay_none().
This would mean that there's no cyclic I/O contention for +2A and +3 emulation, which seems wrong... but I'll open another bug for this.