Add "--line-buffered" to the grep command. But as stated in the answer by @Nick, you will get an email for each line. May want to just remove the "-B4" argument from the grep command.
tail -F --max-unchanged-stats=5 somelogfile.log | grep -B4 --line-buffered "FATAL" | while
read ERROR
do
echo "$ERROR" | mail -s 'FATAL ERROR' admin@someserver.com
done
Try this. I tested on my CentOS 6.9 VM and I believe it does what you are looking to accomplish. When the script is first started, you may get a few emails if there are "FATAL" messages near the bottom of the log file.
#!/bin/bash
tail -f --max-unchanged-stats=5 somelogfile.log | grep --line-buffered "FATAL" | while read ERROR
do
grep -B4 "$ERROR" somelogfile.log \
| mail -s 'FATAL ERROR' admin@someserver.com
done