The reason you get different vertex sizes is that by default the specified vertex size is interpreted in terms of the minimum distance between vertices. This is probably done so that no vertices touch or overlap as long as you have the vertex sizes smaller than 1.
g1 = Graph[{1 -> 2, 2 -> 3}, VertexSize -> 1/3, ImageSize -> {300, 300}];
g2 = Graph[{1 -> 2, 2 -> 3, 3 -> 1}, VertexSize -> 1/3, ImageSize -> {300, 300}];
Row[{g1 // Framed, " ", g2 // Framed}]

The trick for many of these problems is to use Scaled as mentioned by ssch in his answer. This scales the object in terms of image size. Its use for VertexSize is undocumented on the VertexSize doc page, but follows logically from many of its uses in other Graphics stuff.
However, this means that you now have to find a suitable size yourself, whereas the designed scaling method really makes sense for graphs.
You could keep using scaled sizes in terms of inter-vertex distance by using the following:
sc = Min[EuclideanDistance @@@ Subsets[AbsoluteOptions[g1, VertexCoordinates][[1, 2]], {2}]]/
Min[EuclideanDistance @@@ Subsets[AbsoluteOptions[g2, VertexCoordinates][[1, 2]], {2}]]
Row[
{
g1 // Framed, " ",
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, VertexSize -> 1/3 sc,
ImageSize -> {300, 300}] // Framed
}
]

FullForm. – crobartie Feb 24 at 21:08