Это невозможно, потому что они выполняются в разных средах (JSP на стороне сервера, JavaScript на стороне клиента). Поэтому они не выполняются в последовательности, которую вы видите в своем коде.
var val1 = document.getElementById('userName').value;
<c:set var="user" value=""/> // how do i set val1 here?
Здесь код JSTL выполняется на стороне сервера, и сервер видит коды JavaScript / Html в виде простых текстов. Сгенерированное содержимое из кода JSTL (если есть) будет отображаться в результирующем HTML вместе с другими вашими кодами JavaScript / HTML. Теперь браузер отображает HTML вместе с выполнением кодов Javascript. Теперь запомните, что для браузера нет кода JSTL.
Теперь, например,
<script type="text/javascript">
<c:set var="message" value="Hello"/>
var message = '<c:out value="${message}"/>';
</script>
Теперь для браузера этот контент отображается,
<script type="text/javascript">
var message = 'Hello';
</script>
Надеюсь, это поможет.