Answer to your first question: that practice could be useful, but would depend on your exact implementation.
But, you are right. Using built-in one-to-one relationship will query the related model each time it's referenced which is intensive. So:
$products->images
is a new query for each record.
Fortunately, there is a better, more efficient way that achieves the same result - PHQL.
Since a one-to-one is basically a joined table that is called up via a second query (when it really doesn't need to), you could accomplish the same thing by doing something like:
$products =
(new \Phalcon\Mvc\Model)
->getModelsManager()
->executeQuery(
"SELECT products.*, product_images.*, product_specs.* ".
"FROM Products AS products ".
"JOIN ProductImages AS product_images ".
"ON products.id = product_images.product_id ".
"JOIN ProductSpecs AS product_specs ".
"ON products.id = product_specs.product_id");
which will only do a single query and give you the same information you wanted before.
This is just one of those times where you have to identify expensive queries and choose an alternate method.