I seem to remember having this problem too with samba.
I remember the oplocks caused some issues, so I disabled them (though I don't think that's related to the execute bit clearing )
iirc the map archive setting was the one that was messing with the execute bits on save.
Here's what I used to use anyway:
path = /
writeable = yes
map archive = no
force user = nick
force create mode = 644
create mask = 644
oplocks = no