To be clear: 'subscribe' does create an order-of-application dependency on the specified resource. It also requests that the subscribing resource receive an 'event' if Puppet changes the state of the resource to which it subscribes. If the subscribing resource is of a type that supports refreshing, then the effect of receiving one or more events is to schedule a refresh of the resource.
For resources that support refreshing (many don't), refreshing is a separate action from syncing. For Execs, the refresh action is to run the Exec's command,
unless you specify otherwise. Normally, the sync action is also to run the command, but you can suppress the sync action altogether (that's what 'refreshonly' does). Therefore, if an Exec is declared without
refreshonly => true and without specifying a 'refresh' attribute, and if it receives an event from another resource (such as one to which it is 'subscribe'd) then its command will be run twice -- once for syncing, and once for refreshing.
Do be aware, too, that there is an historic family of bugs / unexpected behavior in play in this area, for which
https://tickets.puppetlabs.com/browse/PUP-1106 is probably the best reference point. That's not in play in the behavior you asked about, but you're nearby.
John