Thanks Sergi. I should have realized this myself, this does indeed work properly as expected.
However, I think the answer to this question is probably “Yes”.
For the record, what I have now just realized is that if the user has changed any of the values in their preferences before they click on the button, then Tryton tries to save these before running the click action. If the user does not have write access to the users model then access is denied and the changes are not saved, and so the button action does not run. Normally saving these changes is done when the preferences window is closed and is handled specially by the set_preferences method, which takes care to clean the values before saving them for the user.