Why not look into the "Setting" app's source code.
In my Nexus 4, "Setting" -> "App" -> "Running" looks like below.

Before getting started, there are five levels in the importance hierarchy in Android Process. These are
1) Foreground process,
2) Visible process,
3) Service process,
4) Background process,
5) Empty process
You can find more details at "Processes and Threads" document in Android Developer site.
I did look into code, and it turned out "SHOW CACHED PROCESSES" shows those processes whose importance hierarchy is equal to or lower than "Background process". On the other hand, "SHOW RUNNING SERVICES" shows those whose importance hierarchy is equal to "Visible process" or higher. I dropped some detail to clearly show main point. You can see the full source code of this part here.
try {
final int numProc = mAllProcessItems.size();
int[] pids = new int[numProc];
for (int i=0; i<numProc; i++) {
pids[i] = mAllProcessItems.get(i).mPid;
}
...
for (int i=0; i<pids.length; i++) {
ProcessItem proc = mAllProcessItems.get(i);
changed |= proc.updateSize(context, pss[i], mSequence);
if (proc.mCurSeq == mSequence) {
serviceProcessMemory += proc.mSize;
} else if (proc.mRunningProcessInfo.importance >=
ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
backgroundProcessMemory += proc.mSize;
MergedItem mergedItem;
if (newBackgroundItems != null) {
mergedItem = proc.mMergedItem = new MergedItem(proc.mUserId);
proc.mMergedItem.mProcess = proc;
diffUsers |= mergedItem.mUserId != mMyUserId;
newBackgroundItems.add(mergedItem);
} else {
...
}
...
} else if (proc.mRunningProcessInfo.importance <=
ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
foregroundProcessMemory += proc.mSize;
}
}
} catch (RemoteException e) {
}
So, back to your question,
They are still in memory, rather than switched to "disk" (as desktops/laptops do), right?
Yes, they are still in memory, but eventually Android system may need to remove old processes to reclaim memory for new or more important processes. To determine which processes to keep and which to kill, the system places each process into an "importance hierarchy".
When the user tab one of these "cached background processes", it would be displayed immediately as it is still in memory, just like a running process, right?
Right. For example, the only reason to keep "Empty process" alive is to improve startup time the next time a component needs to run in it.
What does Android do when it "cache" an application?
AFAIK, it simply do not kill the process and keep the resources to immediately respond to User when he/she comes back.