(I couldn't leave this problem alone...)
Good news: this is not a bug in the Particle OS.
Bad news: Fragmentation is not supported by the Particle OS, as indicated in the Particle online documentation, BLE portion (i.e. it supports maximum 244 byte packets, which avoids fragmentation).
Turns out the negotiated MTU is not the problem. It's now clear to me that both the Particle BLE layer and the SoftDevice engine are operating with the exact same MTU (in my case 247).
(Based on information given to me by Nordic) During BLE fragmentation it is possible to receive payload packets that are as large as MTU less 1 byte long. So what I have been observing (245 byte packets) is proper BLE behavior. Unfortunately, the current Particle OS layer does not allow packets greater than MTU-3 in size, no matter the MTU size.
I'm still happy with my workaround. Adding fragmentation support will clearly require some thought and plenty of testing.