When I use ExecWait uninstaller.exe it doesn't wait for the uninstaller
From NSIS Wiki
The NSIS uninstaller copies itself to the temporary directory, runs the temporary uninstaller created and then exits. This is done so it will be able to delete itself.
You can disable this system using the following command line parameter:
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
You will, of course, have to replace uninstall.exe with the name of your uninstaller.