I don't think the semantics are any more imperative than IO in Haskell, it's just that there's a different abstraction used for dealing with it.
Moreover, Tasks are absolutely monadic, with `andThen` being the bind operator. Elm just chooses to focus on the individual use-case, as opposed to focusing on the broader abstraction.