I think this happens because
npm run watch creates a symlink in the Plugins folder that points to the build inside the source repo, but publishing and installing the production plugin will create a real .sketchplugin there and symlinking stops working from then on.
I've created an alias in my zsh config which I can run quickly to clear this and then
npm run watch will work as usual:
alias clearplugins="rm -rf /Users/me/Library/Application\ Support/com.bohemiancoding.sketch3/Plugins/my-plugin.sketchplugin"