A colleague of mine implemented "frozen columns" by having two DataGrids. It was for a project at a previous job and can't share the code, but the implementation goes like this:
Create two DataGrids. One will have the frozen column(s).
Put them next to each other horizontally. The one on the left-hand side becomes frozen by having a fixed width (and therefore no horizontal scrollbar).
They share the same DataProvider (they just display a different set of columns of the same data) and Pager. Well, I don't remember if you can use the same Pager or have to synchronize between the two.
The tricky part is to synchronize scrolling through rows of data, but that only applies if you have more rows that can fit on the screen so that you have a vertical scrollbar. You can avoid this work if you have a set height and you only visualize more rows through paging.
(Shameless plug:) see these slides from my GWT.create 2013 presentation for other Cell-based Widget customizations: