Preheat the broiler. Line a baking sheet with aluminum foil and place the tomatoes and garlic on it. Broil, turning the tomatoes and garlic every few minutes, until tomato skins are blistered and slightly charred and the garlic feels soft to the touch, 10 to 15 minutes. Remove from the broiler and set aside to cool.
In the meantime, heat a medium skillet over medium-high heat. Add the guajillo and dried chipotle chiles and toast for about a minute on each side, pressing each one down with a spatula so the entire chile comes in contact with the hot pan. (If using canned chipotles, skip the toasting and soaking steps and add them to the blender in the next step.) Transfer the chiles to a bowl and cover with very hot water; set aside to soften for 10 to 15 minutes.
When the chiles are soft, drain them in a sieve set over a bowl; reserve the liquid.
When the tomatoes and garlic are cool, peel the garlic and put the tomatoes and garlic in the blender, along with the onion, half of the chiles, and the salt. Puree until smooth, then add about ½ cup (120 ml) of the chile soaking liquid and blend again until smooth. Taste, and if you’d like more chile heat, add more of the soaked chiles. (Discard any you don’t end up using, or reserve for another use.)
Heat the oil in a large deep skillet or wide saucepan over medium heat. Pour the tomato-chile sauce into the pan and bring it to a boil. Reduce the heat to low and simmer for 10 minutes, adding a few spoonfuls of water if the sauce seems too thick. Taste the sauce and adjust with more salt if needed; cover and set aside while you prepare the fish patties.