Encontra a contagem de linha de "Primeiro Padrão", então usa a cabeça para exibir as linhas acima dela, canaliza através do tac e passa para ela.
head --lines=+"$(grep -nm1 "First Pattern" file | cut -d\: -f1)" file | tac | grep -m1 "Pattern2"
Por exemplo.
head --lines=+6 file | tac | grep -m1 "Pattern2"
Isso é mais confiável do que usar -m 1000000 no grep. Como a velocidade é importante para o OP, verifiquei o tempo de execução e também parece ser mais rápido do que todas as outras respostas atuais (no meu sistema)
wc -l file
25910209 file
time awk '/Pattern2/ {line=$0; next}; /First Pattern/ {print line; exit}' file
Pattern2:TheRightBar
real 0m2.881s
user 0m2.844s
sys 0m0.036s
time sed '/Pattern2/h;/First Pattern/!d;x;/Pattern2/!d;q' file
Pattern2:TheRightBar
real 0m5.218s
user 0m5.192s
sys 0m0.024s
time (grep -m1 "First Pattern" file -B 10000000 | tac | grep -m1 "Pattern2")
real 0m0.624s
user 0m0.552s
sys 0m0.124s
time (head --lines=+"$(grep -nm1 "First Pattern" file | cut -d\: -f1)" file | tac | grep -m1 "Pattern2")
Pattern2:TheRightBar
real 0m0.586s
user 0m0.528s
sys 0m0.160s