Found another interesting fact. According to wireshark on my client laptop, I'm sending TCP packets as 1514 byte frames in both cases.
According to Wireshark on my MAC, passively sniffing the air in monitor mode, these frames are sent as 1606 bytes frames when it's working good, and 1610 bytes frames when not working so good.
Now to the really interesting part. On the desktop running the iperf server, if I tcpdump the traffic there, in the non-working case (40Mbps), I see all the frames as standard 1514 byte frames:
18:10:32.815832 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9808688:9810148, ack 1, win 53248, length 1460
18:10:32.816144 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9810148:9811608, ack 1, win 53248, length 1460
18:10:32.816149 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.51340: Flags [.], ack 9811608, win 936, length 0
18:10:32.816644 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9811608:9813068, ack 1, win 53248, length 1460
18:10:32.817615 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9813068:9814528, ack 1, win 53248, length 1460
18:10:32.817623 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.51340: Flags [.], ack 9814528, win 936, length 0
18:10:32.817874 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9814528:9815988, ack 1, win 53248, length 1460
18:10:32.818421 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9815988:9817448, ack 1, win 53248, length 1460
18:10:32.818426 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.51340: Flags [.], ack 9817448, win 936, length 0
18:10:32.818788 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9817448:9818908, ack 1, win 53248, length 1460
18:10:32.819111 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9818908:9820368, ack 1, win 53248, length 1460
18:10:32.819116 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.51340: Flags [.], ack 9820368, win 936, length 0
18:10:32.819373 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9820368:9821828, ack 1, win 53248, length 1460
18:10:32.819838 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.51340 > 192.168.88.99.5201: Flags [.], seq 9821828:9823288, ack 1, win 53248, length 1460
However, when it's working good, I receive them "jumbo-frames":
18:16:12.632084 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 4434: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55102472:55106852, ack 1, win 53248, length 4380
18:16:12.632091 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55106852, win 3709, length 0
18:16:12.632135 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 5894: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55106852:55112692, ack 1, win 53248, length 5840
18:16:12.632141 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55112692, win 3709, length 0
18:16:12.632185 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 5894: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55112692:55118532, ack 1, win 53248, length 5840
18:16:12.632192 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55118532, win 3709, length 0
18:16:12.632236 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 5894: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55118532:55124372, ack 1, win 53248, length 5840
18:16:12.632242 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55124372, win 3709, length 0
18:16:12.632285 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 5894: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55124372:55130212, ack 1, win 53248, length 5840
18:16:12.632292 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55130212, win 3709, length 0
18:16:12.632339 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 1514: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55130212:55131672, ack 1, win 53248, length 1460
18:16:12.632528 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 4434: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55131672:55136052, ack 1, win 53248, length 4380
18:16:12.632534 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55136052, win 3709, length 0
18:16:12.632580 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 5894: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55136052:55141892, ack 1, win 53248, length 5840
18:16:12.632587 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55141892, win 3709, length 0
18:16:12.632630 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 5894: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55141892:55147732, ack 1, win 53248, length 5840
18:16:12.632636 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55147732, win 3709, length 0
18:16:12.632680 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 5894: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55147732:55153572, ack 1, win 53248, length 5840
18:16:12.632686 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55153572, win 3709, length 0
18:16:12.632729 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 2974: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55153572:55156492, ack 1, win 53248, length 2920
18:16:12.632735 d4:be:d9:a3:bf:d3 > a4:34:d9:63:f9:0c, ethertype IPv4 (0x0800), length 54: 192.168.88.99.5201 > 192.168.88.53.49771: Flags [.], ack 55156492, win 3709, length 0
18:16:12.632779 a4:34:d9:63:f9:0c > d4:be:d9:a3:bf:d3, ethertype IPv4 (0x0800), length 4434: 192.168.88.53.49771 > 192.168.88.99.5201: Flags [.], seq 55156492:55160872, ack 1, win 53248, length 4380