I just checked Delphi, implemented a message capture of the WM_COMMAND+ LBN_SelChange and the operation is exactly the same as the LCL is.
The LBN_SelChange signal gets sent always no matter, as does the current OnSelectChange.
SO from my point of view, it is working as the LBN_SelChange suggest. The difference is that this event gets a USER check point to separate the difference between software and user operations.
If this works differently on other targets then let it be because what I've seen, they kind of make things work the way they want and not follow windows rules.
I believe this is more of a Documentation issue and poor choice of wording on the event.
As for deciding if the selection actually changed, I don't have an issue with that, I merely store the previous ItemIndex and compare it with the new one.