I was able to get it to generate the query by putting the subquery directly in the main query. I gave up on trying to get it to work with a select alias or a subquery as illustrated in the documentation.
I did need to disambiguate the table names by using 'aliased'.
from sqlalchemy.orm import aliased
outer_persons = aliased(persons)
inner_store = aliased(stores)
outer_store = aliased(stores)
myQuery = mySession.query(outer_persons)\
.select_from(outer_persons)\
.outerjoin(outer_stores, outer_stores.store_name == select([inner_stores.store_name])\
.where(func.ST_DWithin(outer_persons.location, inner_stores.location, radiusMeters))\
.order_by(func.ST_Distance(outer_persons.location, inner_stores.location))\
.limit(1))\
.filter(<stuff>)\
.order_by(<rules>)\
.limit(<number>)