Eu estou postando uma resposta para a minha própria pergunta, porque eu consegui juntar algo e essa pergunta não parece ter nenhum interesse. Se aparecer em uma pesquisa no google, isso deve ajudar alguém.
O seguinte parece funcionar para mim até agora:
frontend app
bind 0.0.0.0:5000
mode tcp
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if HTTP
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend testing_http if HTTP
default_backend testing_https
backend testing_https
mode tcp
acl app_2 req.ssl_sni -i foo.bar.com
use-server server2 if app_2
use-server default if !app_2
server server2 127.0.0.1:777
server default serverfault.com:443
backend testing_http
mode http
acl app_2 hdr_dom(host) -i foo.bar.com
use-server server2 if app_2
use-server default if !app_2
server server2 127.0.0.1:777
server default www.example.com:80
As partes importantes a serem compreendidas - o frontend verifica se a solicitação é HTTP. Se não for, ele verifica se é uma solicitação SNI. Caso contrário, não aceita.
A outra parte que me enganou foi o host correspondente no backend http. Era importante usar a correspondência de domínio com hdr_dom em vez de hdr para que uma porta especificada manualmente na string não quebrasse a acl.
A parte mais difícil é que o modo tcp no front end não tem logging útil para http. E como o backend http não pode registrar, você não recebe nenhuma informação http.