ja que ninguém respondeu, eu vou responder as pequenas diferenças que encontrei, lendo no livro “enterprise javabeans 3.0”, paginas 53, 54 e 55.
Primeiro que se o objeto que você está usando não está sendo gerenciado pelo hibernate, o merge atualiza o banco com essas informações e cria um objeto gerenciado com cópia dos dados do objeto que você passou, retornando-o. (o objeto que você passou ainda não é gerenciado). Nessas condições o refresh retornaria uma IllegalArgumentException.
Outro detalhe é que o refresh não depende de um commit por exemplo para gravar de fato no banco (pelo que eu entendi), diferentemente do merge. O merge, persist ou remove são dependentes do FlushModeType (pagina 55).
Acredito que sejam só esses detalhes (que eu mesmo precisei confirmar no livro).