You don't need to use grep to check if a string contains a substring.  The built-in pattern matching in Bash is sufficient.  This code should do something close to what you want:
if ERRMSG=$(cd /nonexist 2>&1) ; then
    echo 'process success'
elif [[ $ERRMSG == *'No such file or directory'* ]] ; then
    echo 'No such file or directory'
else
    echo 'empty'
fi >> "$FQLOGNAME"
See the Conditional Constructs section of the Bash Reference Manual for details of the pattern matching capabilities of [[...]].
I've retained the ERRMSG and FQLOGNAME variables, but note that it's best to avoid ALL_UPPERCASE variable names.  There is a danger that they will clash with environment variables or Bash builtin variables.  See Correct Bash and shell script variable capitalization.
To find error messages defined by a pattern in multi-line error messages, and only print the first one, you can use regular expression matching (=~) in [[...]].  To provide a concrete example, this code assumes that error messages consist of 'ERROR' followed by one or more spaces followed by a decimal number:
# Example function for testing
function dostuff
{
    printf 'Output line A\n'
    printf 'Encountered ERROR 29\n' >&2
    printf 'Output line B\n'
    printf 'Encountered ERROR 105\n' >&2
    printf 'Output line C\n'
    return 1
}
# Regular expression matching an error string
readonly error_rx='ERROR +[0-9]+'
if ERRMSG=$(dostuff 2>&1) ; then
    echo 'process success'
elif [[ $ERRMSG =~ $error_rx ]] ; then
    printf '%s\n' "${BASH_REMATCH[0]}"
else
    echo 'empty'
fi >> "$FQLOGNAME"
It appends 'ERROR 29' to the log file.
For more information about Bash's built-in regular expression matching see mklement0's answer to "How do I use a regex in a shell script?".