Your let is syntactically wrong for what you are trying to do. Try this:
(let ((val (read-string "Enter value: "))) (message (format "Value entered: %s" val)))
You should read the docstring of let with C-h f let carefully. It says:
Bind variables according to VARLIST then eval BODY. The value of the last form in BODY is returned. Each element of VARLIST is a symbol (which is bound to nil) or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM). All the VALUEFORMs are evalled before any symbols are bound.
So when you write (let (foo bar) ...), foo and bar are symbols and are bound to nil. You need to write (let ((foo "something"))...) in order for foo to be bound to "something".
The description of let in the Emacs Lisp Reference manual is also useful. Here's the part that's relevant to your question:
... Each of the BINDINGS is either (i) a symbol, in which case that symbol is locally bound to ‘nil’; or (ii) a list of the form ‘(SYMBOL VALUE-FORM)’, in which case SYMBOL is locally bound to the result of evaluating VALUE-FORM. If VALUE-FORM is omitted, ‘nil’ is used. ...
[let-binding]. If you find that this is a duplicate, please delete this one. Thx.read-stringto the value"Enter value: "(and variablevaltonil).