Modifying views exposed filter query string
Came up with a solution using hook_views_pre_render combined with a JS history.replacestate. More of a workaround, but it does the job. Would still like to find a way to modify the view object or a PHP hook though.

Here's a stripped down version of the php hook implementation:

function mymodule_views_pre_render(&amp;$view) {
  if ($view-&gt;name == "myviewname") {
    $path_settings = array("mymodule" =&gt; array('query_params' =&gt; array()));
    foreach ($_GET as $key =&gt; $val){
      if (array_key_exists($key, $view-&gt;exposed_input)) {
        $path_settings['mymodule']['query_params'][$key] = $view-&gt;exposed_input[$key];
      }
    }
    drupal_add_js($path_settings, 'setting');
  }
}


Then in the module's js attached behaviors:

function tidyViewsQueryString() {
  currentLocation = window.location.href;
  for (var key in Drupal.settings.mymodule.query_params) {
    if (Drupal.settings.mymodule.query_params.hasOwnProperty(key)) {
      currentLocation = updateUrlParameter(currentLocation, key, Drupal.settings.mymodule.query_params[key])
    }
  }
  if (currentLocation != window.location.href){
    window.history.replaceState(null, document.title, currentLocation);
  }
}

//From https://gist.github.com/niyazpk/f8ac616f181f6042d1e0
function updateUrlParameter(uri, key, value) {
    // remove the hash part before operating on the uri
    var i = uri.indexOf('#');
    var hash = i === -1 ? ''  : uri.substr(i);
         uri = i === -1 ? uri : uri.substr(0, i);

    var re = new RegExp("([?&amp;])" + key + "=.*?(&amp;|$)", "i");
    var separator = uri.indexOf('?') !== -1 ? "&amp;" : "?";
    if (uri.match(re)) {
        if (value.length &gt; 0)
          uri = uri.replace(re, '$1' + key + "=" + value + '$2');
        else 
          uri = uri.replace(re, '$1' + '$2')
    } else {
        uri = uri + separator + key + "=" + value;
    }
    return uri + hash;  // finally append the hash as well
}