Stephen,
Strange number 2 does not work for you. Recreating the app should ensure that your new app gets the latest changes of the widget code. This is what I do every day in widget development for WAB and do not have an issue with this workflow. The only time I have to re-start NodeJS is when I make a change in the nls strings.js file and occasionally when I make a html change that seems to be cached.
Here is my normal workflow:
What I find that works is this. When developing, I code my widget and save those changes and delete the old app in WAB and create a new one each time I make code changes (this is a workflow I started in Beta version so I just stuck with it.). I give the new app a simple name like "ID" and I do not configure anything but my widget I am developing. Then I go and make more changes in my widgets code and save and back in WAB I once again delete the old "ID" app and create a new one (this way I am sure that the "ID" app has the latest widget code).
If I make changes to the widgets nls/strings.js, I will have to restart Node to catch those changes. I have sometimes noticed the same for *.html file changes.
Creating a new app each code iteration is what I found to be the best workflow