When a file is open for reading, it usually is shared for reading (i.e. no exclusive lock), but not for writing.
And it seems that is what NSIS does:
HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd)
int attr = GetFileAttributes(fn);
attr == INVALID_FILE_ATTRIBUTES ? 0 : attr,
Sharing a file for writing, while you still are reading from it, is inherently dangerous...
(And, as FILE_SHARE_READ is hardcoded, you cannot change it without re-compiling the EXE headers)