O ODBC é útil se você deseja um adaptador padrão que fale uma API semelhante para bancos de dados diferentes. Eu pessoalmente acho que é uma API horrível, mas é amplamente compreendida e bem documentada.
A libpq fala mais diretamente com o PostgreSQL. Você pode obter um melhor desempenho com ele, mas provavelmente não o suficiente para fazer alguma diferença para a maioria dos aplicativos, que gastam tempo na execução de consultas, latência de rede etc., não na biblioteca cliente.
Versões mais recentes do psqlODBC são construídas na libpq e servem como um wrapper ODBC para libpq.
Há também o libdbi, que oferece uma API menos assustadora que o ODBC.
Para completar, há também o SPI de back-end do servidor, que pode ser usado por funções definidas pelo usuário escritas em C e carregadas no servidor PostgreSQL. Não é útil fora das extensões e funções do servidor.
Ah, e há ecpg. Não use epg. É uma ferramenta SQL integrada à linguagem superlegada que existe principalmente para facilitar a portabilidade de alguns outros mecanismos de banco de dados. Não use epg. Sério.
Para C++, há a interface QtSQL (excepcionalmente para Qt, é horrível e dolorosamente limitada, não a use) e libpq++ (OK, mas em grande parte sem manutenção).
Pessoalmente, escrevo código libpq diretamente, mas isso é porque estou trabalhando em código que geralmente entra no PostgreSQL. Se você não consegue imaginar como alvo qualquer coisa exceto PostgreSQL, você pode querer escrever código libpq; caso contrário, provavelmente use ODBC com psqlODBC.