byte[] data, который Вы получаете в preview, в глобальном понимании immutable. т.е. менять его Вы, конечно, можете, но это никоим образом не будет отражаться на ассоциированном SurfaceHolder'е. Если Вы хотите изменять data, то нужно сделать дополнительный View и отдельно у себя в коде его отображать, например конвертированием в Bitmap и далее в ImageView, примеры таких операций Вы уже похоже находили.
onPreviewFrame не более чем механизм notification от Android. Все отображение происходит за рамками вашего кода, Вы лишь указываете куда писать preview.