That of @rozcietrzewiacz is a great solution, but if you still want to stay with text files (as returned by `file`), you can carefully build an array of file names, then execute your `grep` command on that array. Here is a pseudo-example

    #!/bin/bash
    
    files() {
      local path="$1"
      find "$path" -type f -exec file --print0 --mime-type {} + |
        awk -F '\0' 'BEGIN { ORS = "\0" }; $2 ~ /text/ { print $1 }'
    }
    
    list=()
    while read -d $'\0' line; do
      list+=("$line")
    done < <(files .)
    
    # to choose options and pattern
    grep <options> <pattern> "${list[@]}"

Also, if file names do not contain newlines, it can be simpler to do

    grep <options> <pattern> "$(
      find "$path" -type f -exec file --print0 --mime-type {} + |
        awk -F '\0' '$2 ~ /text/ { print $1 }')"

(note the double quote arounf `$()`).