jq is powerful enough to express it in one query: it has variables (using expr as name) which make this thing at least vaguely feasible. That doesn't mean you should, but you could:
.models
| (.[]
| if .title == "farmers"
then
(.fields | .[] | if .name == "Fruits" then .key else empty end)
as $fruits
| (.fields | .[] | if .name == "Full name" then .key else empty end)
as $name
| .entities
| .[]
| if .[ $name ] == "Bob, the farmer" then .[ $fruits ] else empty end
else empty end)
as $fruits
| .[]
| if .["title"] == "fruits"
then
( .fields | .[] | if .name == "Name" then .key else empty end) as $fruit_name
| .entities | [ .[] | {(._id): .[$fruit_name]} ] | add as $lookup
| $fruits | .[] | $lookup[.]
else empty
end
(I'm not claiming this is the best way to write that query, but it's the first one I came up with.)