Vous pouvez utiliser la solution suivante:
Utilisez d'abord v$pour sélectionner le texte du curseur jusqu'à la fin de la ligne. Utilisez ensuite la commande suivante:
:s/\%V\ /_/g
Pour \%Vindiquer de modifier le texte dans la zone précédemment sélectionnée visuellement, voir :h /\%V.
Si je prends votre exemple:
function my_function(argument, another argument, but there are spaces)
Si mon curseur se trouve sur la 40e colonne et que j'utilise la commande que je viens d'écrire, j'obtiens:
function my_function(argument, another argument,_but_there_are_spaces)
En réponse à votre commentaire, vous pouvez également utiliser 
\%# qui correspond à la position du curseur 
\%>23c qui correspond après la 23e colonne. 
\%>'m qui correspond après la position d'une marque 
Voir :h /\%#, :h /\%>cet :h /\%>'m.
@ User9433424 a donné un moyen d'utiliser \%#dans son commentaire. Pour le motif avec la marque, vous pouvez le définir avec ma, puis utiliser:
:s/\%>'a /_/g
Une explication du modèle donné par @ User9433424 est la suivante:
:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores
Vous aurez envie de voir :h \vet:h /\@<=
               
              
\%#. Ainsi, vous pouvez utiliser::s/\v(%#.*)@<= /_/g. Ce qui pourrait être décrit comme un espace précédé de (@<=) caractères après la position du curseur.