GPU Python module: why drawed pixels are shifted in the result image?
I was lucky enough to be drived to the solution by dr.sybren, hypersomniac and mano_wii!!

The solution is to setup the projection matrix appropriately to translate wanted coordinates in pixels (in my case 1920x1080) to normalized coordinated between -1 and 1. 

So before running the batch, we need to reduce the scale by half the dimensions and translate the projection by -1 in x and y:

projection_matrix = Matrix.Diagonal( (2.0 / dim_x, 2.0 / dim_y, 1.0) )
projection_matrix = Matrix.Translation( (-1.0, -1.0, 0.0) ) @ projection_matrix.to_4x4()
gpu.matrix.load_projection_matrix(projection_matrix)


The complete code part is:

def render_offscreen( dim_x, dim_y, vertices, indices, color = (0, 0.5, 0.5, 1.0) ):

    offscreen = gpu.types.GPUOffScreen( dim_x, dim_y )

    with offscreen.bind():

        with gpu.matrix.push_pop():            
            projection_matrix = Matrix.Diagonal( (2.0 / dim_x, 2.0 / dim_y, 1.0) )
            projection_matrix = Matrix.Translation( (-1.0, -1.0, 0.0) ) @ projection_matrix.to_4x4()

            gpu.matrix.load_projection_matrix(projection_matrix)

            shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
            batch = batch_for_shader(shader, 'TRIS', {"pos": vertices}, indices=indices)

            shader.bind()
            shader.uniform_float("color", color)
            batch.draw(shader)

            buffer = bgl.Buffer(bgl.GL_BYTE, dim_x * dim_y * 4) 
            bgl.glReadBuffer(bgl.GL_BACK)

            bgl.glReadPixels(0, 0, dim_x, dim_y, bgl.GL_RGBA, bgl.GL_UNSIGNED_BYTE, buffer)

    offscreen.free()

    return buffer