This is an ancient post, but it's a good question so I'll give it an answer.
I'll give an example of how this might be done with rasterVis::levelplot, using the 3-channel R logo raster data that comes with raster.
library(rasterVis)
b <- brick(system.file("external/rlogo.grd", package="raster"))
Plotting three-channel RGB rasters with levelplot
Create an empty raster with the same dimensions and extent as the brick.
r <- raster(b)
Calculate the hexadecimal colours corresponding to the values of the RGB channels, and coerce to factor.
cols <- factor(rgb(b[], maxColorValue=255))
Assign these factor values to the raster's cells.
r[] <- cols
Plot with levelplot, extracting the hexadecimal colours from the levels of cols and passing them to col.regions.
levelplot(r, col.regions=as.character(levels(cols)), colorkey=FALSE)

Adding north arrow and scale bar
For the north arrow and the scale bar, we will look to @OscarPerpiñán's docs.
levelplot(r, col.regions=as.character(levels(cols)), colorkey=FALSE) +
layer(SpatialPolygonsRescale(layout.north.arrow(), offset = c(5, 10), scale = 10)) +
layer({
xs <- seq(5, 25, by=5)
grid.rect(x=xs, y=5,
width=5, height=2,
gp=gpar(fill=rep(c('transparent', 'black'), 2)),
default.units='native')
grid.text(x=xs-2.5, y=8, seq(0, 400, by=100),
gp=gpar(cex=0.7),
default.units='native')
})
I'll leave it up to you to calculate the true distance (passed to grid.text) associated with the width, in map units, of the rectangles.
