The following happens:
You map fromMaybe over an IO value. Hence the left part
fromMaybe <$> (print "A" >> return True)
is an IO action that could be rewritten thus
print "A" >> return (fromMaybe True) :: IO (Maybe Bool -> Bool)
This means that the "A" will be printed no matter what.
Note that the IO monad is all about sequencing actions, hence an action later in the >>= chain can never affect whether earlier actions are executed.
Consider
fromMaybe <$> (getChar >>= return)
It is clear that the Char the fromMaybe is applied to must come from actually reading a character. It is not the case that the character will only be read when it is needed.
If this were so, the following code would not make sense:
do
a <- getChar
b <- getChar
-- at this point, a and b have been actually read from stdin already
return (a < b)
For, it is not known whether (<) evaluates its left or right argument first.
Rather, in any case, a gets the value of the first character read and b that of the second. And the meaning of the code snippet is, accordingly, to read two characters and to check whether the first character read is lower than the second.
Indeed, if an IO action would be executed only when its value is actually needed, many programs wouldn't print anything, as it stands. This is because code like
print "A" >> print "B"
deliberately ignores the result of the first print.
For the same reason, the "B" will always be printed.