Selling the binary is difficult, which is why it's best to provide a "service" of a mix of things which also happens to include access to the binary. Then, you can refuse to provide future service if the end-user makes the code public.
It's a bit sticky, because the GPL doesn't allow any constraint on distribution. However, the argument intellectually is that you're not stopping distribution you are merely refusing to deliver the "service" due to a breach of the service agreement - "I'm not stopping you distribute, I'm saying if you distribute then I won't be providing this separate service X".
Here's a 2014 example from a RedHat APAC service agreement:
"Distributing the Software or any portion of the Subscription Services to a third party or using any of the Subscription Services for the benefit of a third party is a
material breach of the Agreement even though the open source licenses applicable to individual software packages may give you the right to distribute those packages (and this Appendix is not intended to interfere with your rights under those individual licenses)"
Where:
"Software” means Red Hat Enterprise Linux, JBoss Enterprise Middleware and other software programs branded by Red Hat, its Affiliates and/or third parties including all modifications, additions or further enhancements delivered by Red Hat.
URL: http://jp.redhat.com/licenses/apac_enterprise_agreement_appe...