Está era la solución. No estaba haciendo bien la subquery.
Código Java:
Ver originalSubquery<Aplicacion> subqueryGrupo = query.subquery(Aplicacion.class);
Root<GrupoAplicacion> filtroGrupo = subqueryGrupo.from(GrupoAplicacion.class);
Join<GrupoAplicacion, Aplicacion> aplicacionesJoin = filtroGrupo.join(GrupoAplicacion_.aplicaciones);
subqueryGrupo.select(aplicacionesJoin);
subqueryGrupo.where(cb.equal(filtroGrupo, grupoAplicacion));
if (asociadas) {
restrictionsList.add(cb.and(cb.in(aplicacion).value(subqueryGrupo)));
} else {
restrictionsList.add(cb.not(cb.in(aplicacion).value(subqueryGrupo)));
}