You could define a function which "wraps" the default play[] in the deck-level script, preventing the original from being called unless your flag is set:
on play x y do if options.widgets.soundsandmusic.value=1 send play[x y] end end
The "send" statement is specifically designed to make it easier to set up these kinds of overrides for existing functions. (Overriding go[] has some interesting potential!)
If you think there are some situations where you may want to call play[] normally, a less invasive approach would be to give your wrapper a different name instead of shadowing the built-in function, and to change e.g. all the instances of play["foo"] within your own scripts to sfx["foo"]:
on sfx x do if options.widgets.soundsandmusic.value=1 play[x] end end
Keep in mind that scripts within modules and contraptions don't "see" deck-level definitions, since they're supposed to be reusable from deck to deck. If you're setting up sound effects for dialogizer text, for example, you'll need to perform the same flag-check. This can also be done in a centralized place with deck-level functions.
Does that make sense?