Eles são diferentes se o pacote for adiado, ou seja, não carregado até que seja necessário. Nesse caso :init, será executado no momento em que seu arquivo emacs for lido pela primeira vez, mas :configserá executado no momento em que o pacote for realmente carregado.
No seu exemplo, o uso de modeimplicitamente adia o carregamento do pacote. Você configurou o pacote para ser carregado na primeira vez que um arquivo html é visitado.
Você pode usar :demandpara garantir que o pacote esteja sempre carregado na inicialização, mas é mais provável que você queira fazer isso aqui :init.
Da documentação:
:init Code to run when `use-package' form evals.
Como você está colocando isso no arquivo user-init, isso basicamente significa que ele será executado na inicialização.
:config Runs if and when package loads.
Portanto, não execute até que o pacote esteja realmente sendo carregado.
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Observe a lista de itens que automaticamente tornam um pacote adiado. Basicamente, se você informar use-packageas condições em que precisa deste pacote, ele pressupõe que não deseja carregá-lo até que essas condições ocorram.
:demand Prevent deferred loading in all cases.
Verifique se o pacote está carregado na inicialização, independentemente de outras opções que você especificou.
Atualizar
Revisitando isso com base nos comentários recentes ... O que eu disse acima é verdade, mas acho que não responde corretamente à pergunta. O problema raiz aqui é, na verdade, que html-modenão é um pacote, mas um modo definido pelo pacote sgml-mode. Isso funciona como esperado para mim:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
No exemplo original, a :configexpressão nunca é avaliada porque um pacote chamado html-modenunca é carregado. Mover a mesma expressão para :initfunciona porque o código init é sempre avaliado, independentemente de o pacote ser carregado.