So it's WinCE related thing only? Then you can try something different, like public state variable set at beginning and end of timer event. If in the destroy event this state is still true (timer code running), then wait until it turns false.
while TimerState do begin
sleep(1);
Application.ProcessMessages;
end;
Timer(s) are already disabled before coming to this loop.