I think it may be a mix of both.
I changed the settings variable in my app and widget and now saving works.
But at one time during testing, I really had two test.json files on the watch.
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
Works fine for me. Though I had to use settings1 as variable name because settings is already reserved for the settings of my watch face.
Maybe it is something similar for you? Is the settings variable already set to something before your code run?
EDIT: have you checked how many test.json files you have? Maybe it is related to this post?