result = Context.query.join(
Request, Request.context_id == Context.id_
).join(
Point, Point.request_id == Request.id_
).disctinct(
Context.id_,
Request.id_,
Point.attr
).group_by(Context.id_).with_entities(
Context.field1, ...
func.count(Point.id_).label('points_count'),
func.count(case([and_(Request.visible == True, Point.visible == True), 1],
else_=literal_column("NULL"))).label('visible_points_count')
)
По решению - попробуйте сделать subquery для Point. Если на attr есть индекс, на производительность это не сильно повлияет.
И join'ить, соответственно, этот query вместо Point'а.