(defun reassign (val)
(setq val 10))
(reassign s)
When you call (reassign s), the value of s is passed down to reassign, where it is locally bound to val. That would be nil in your case, assuming you already declared s with DEFVAR before setting it to () (see setq and defvar in Lisp).
Inside reassign, the call to SETQ changes the local binding.
Global binding
Each symbol can hold a global value.
If you want to change the value cell of a symbol, use the SYMBOL-VALUE accessor:
(setf (symbol-value 's) 10)
Notice how s is quoted. You are not changing the symbol currently bound to s (which would be nil, a constant variable), but the s symbol itself. (SETF SYMBOL) is like calling SET directly.
Lexical and dynamic binding
If however, you want to modify any kind of place, and in particular lexical and dynamic variable bindings, you need to define a macro:
(defmacro reassign (place)
`(setf ,place 10))
SETF expands into the code necessary to update a place. You could also give (gethash key table) instead of just an unquoted variable, which would then update the content of a table.
In the case of local variables, the code that calls reassign will eventually expands into a call to the special operator SETQ, which knows how to change lexical bindings (it also handles SYMBOL-MACROLET bindings).