I think that causes because your hook is only being used for passing data.. When you do setValue() in your hook snippet it will set an extra key=>value to the fields list (or overwrite another fields value) but it's not being used in the form again, but it will be passed to the next hook or email placeholders etc.
I did some little test with the same setup, but with validation, and that's probably how it works.
What I see in FormIt's request handler class;
...
/* process form */
if ($this->formit->postHooks->hasErrors()) {
$success = false;
$this->formit->postHooks->processErrors();
} else {
/* assign new values from postHooks */
$this->dictionary->fromArray($this->formit->postHooks->fields);
}
...
But that means that you shouldn't set an error and probably also shouldn't return false to get into that else part. That postHooks->hasErrors() part is about all your hooks, so that would help too.. I tried to set a second snippet hook with the error, and the first one is just setting the other value, but that doesn't matter.
I also tried to make it as custom validator.. but you don't have a setValue() in there, and your even don't have the possibility to reset the value back in the fields array which is available there...
Pfiew.. you make it difficult ;-)
Why not just passing the new value to the next step? ;-)