I think I found the issue - it was because I the app uses a tray icon and WM_CLOSE doesn't fully close the app. This appears to play badly with the Windows restart manager. The solution was to use a custom script to terminate the app during update / removal.