This section of the "Polygon covering" page in Wikipedia
implies that brute-force trial and error
(generating all the partitions into rectangles and taking the one
with the fewest rectangles)
is the best you can do in general.
The problem I think you're describing is $NP$-hard.
But the $NP$-hardness of a problem often describes only the
worst-case times due to some pathological cases.
The figures you gave as examples look relatively "nice."
You could use some heuristics to make the algorithm try large rectangles
in cases such as these, which would often lead it to find the minimal
covering quickly; you then might use some "branch and bound" method
to quickly rule out all other possible coverings.
For example, once you have found a covering with $n$ rectangles,
when you are searching for another covering and have already put
$n-1$ rectangles in the covering without completing it, you can
rule out all the coverings that include those $n-1$ rectangles.
This could very quickly eliminate large portions of your search space.