Each let must have its own in (except in do notation and list comprehensions).
You could therefore use
createObject lst =
let x = lst !! 0
in let y = lst !! 1
in let z = lst !! 2
in object(x,y,z)
but this is not idiomatic, since a single let can involve a block of definitions. Indeed, @jkeuhlen showed above the idiomatic use of let.
You should however avoid using !!, which is slow and partial, and prefer pattern matching whenever possible.
createObject :: [a] -> object a
createObject [x,y,z] = object (x,y,z)
createObject _ = error "createObject: input list must have length 3"
or
createObject :: [a] -> object a
createObject (x:y:z:_) = object (x,y,z)
createObject _ = error "createObject: input list must have length >= 3"
Note that the above is still a code smell: the input type [a] looks wrong, since it seems to allow any list length, when it actually works only on length 3 (or larger, in the second case, ignoring the other elements).
It is hard to guess what you actually need, here.
letsby using eg.createObject (x:y:z:_) = object (x,y,z)(and you'll probably want to add a case for when the list is less than 3 elements long).