単純なものなら、下の図のように startLayer と batonLayer が baseLayer 内で切り替わることで十分表現できる。

Fig.1

後は、反応時間を表示するために startLayer の文字列を置き換えられれば完璧か?

Fig.2

となると、調べることは

 CATextLayerの文字列は変更可能か
 CALayerは表示したり隠したりできるか
 
の2点になる。
文字列はstringを再設定できるかってことになるし、表示/非表示はCore Animation プログラミングガイド 日本語訳版にそれらしい項目として
 
 hidden

があった。
さっそく実験してみましょう。

今回はawakeFromNibで全レイヤの準備をして、クリックで呼び出されるtestで表示状態を切り替える。そのための状態変数は

 running
 
をそのまま利用。
こいつが TRUE の時は batonLayer を表示している状態とする。
したがってtest側でやることは

running == TRUE:
 running を FALSE にする。
 batonLayer を隠す。
 startLayer を表示する。
 startLayer の文字列を設定する。

running == FALSE:
 running を TRUE にする。
 startLayer を隠す。
 batonLayer を表示する。

となる。
awakeFromNib側で作ったレイヤにtest側でアクセスするには専用の変数を用意するか、すでに利用している view 変数から

 CALayer* layer = [view layer]

で baseLayer を取りだし

 NSArray* list = [layer sublayers]

で baseLayerに登録されてるレイヤリストを取りだし

 CALayer* layer = [list objectAtIndex:インディックス]

で startLayer 、batonLayer を取り出すことになる。インディックスは先に baseLayer に追加した方が 0、後が 1 となる。

 CATextLayer* startLayer = [[[view layer] sublayers] objectAtIndex:0];
 CALayer* batonLayer = [[[view layer] sublayers] objectAtIndex:1];

こんな感じ。あとは

 static int count = 1;
 startLayer.string = [NSString stringWithFormat:@"count = %d", count++];

というふうに文字を設定。

 static int count = 1;
 [NSString stringWithFormat:@"count = %d", count++];

に関してはC言語知ってる人ならstatic intは問題ないよね。stringWithFormatはprintfみたいなもんです。C言語知らない人で確認せずにはいられない人は、staticに関してはC言語講座:第10章あたり読んでみてね。
stringWithFormat はソースのstringWithFormatを選んだ状態でオプションキーを押しながらダブルクリックだ!

 レイヤを隠したり表示したりは

 startLayer.hidden = NO;
 batonLayer.hidden = YES;

サンプルではpositionも設定したりしてる。position はCore Animation プログラミングガイドのレイヤジオメトリと変換で説明されてる。
ま、いつものように下のサンプル実行してみりゃわかるよ。
------------
サンプルプロジェクト:swap.zip

Core Animation プログラミングガイド 日本語訳版