Você pode :set virtualedit+=onemore , que permite que você passe apenas pelo último caractere. Infelizmente para você, $ ainda vai para o último caractere; você tem que passar o cursor para passar por ele. Por outro lado, você pode usar g$ , que normalmente vai para o último caractere da linha tela em uma linha que envolve; no modo onemore , também passa o último caractere de uma linha não encapsulada (ou a última linha de uma linha envolvida).
:h 'virtualedit' diz que essa opção pode atrapalhar os scripts, mas não sei qual é o tamanho do risco na realidade.