why parsing must be on the PE side
This is coming from the faily recent PE/unix separation introduction, which enforces the boundaries between the PE and unix world in Wine. It was previously much less strictly enforced and code could be shared more freely as there was no clear boundaries.
Now the HID parser is implemented as the Windows hidparse.sys static library, and uses Windows APIs internally, which means that using it from the unix side it would fail to link many of its symbols. It could perhaps be made more portable, and the static library used from the unix side, but that would require more change and didn't seem necessary so far.
we couldn't just call `winebus_call(device_remove, ¶ms);` when hidraw device is not preferred and rely on the device subsystem hierarchy?
I'm not sure what you mean by that. It wasn't done when devices were ignored, but that was an oversight and I added a call now so that we also stop listening on ignored device events.
If you mean, delay the moment we discard one of the devices up to the point where we have their report descriptors parsed already, and remove one of the duplicated devices, then it could perhaps have been done like that too, I only preferred to avoid having the devices exposed even briefly.