それでこんな感じ? 初期局面出力してないけど、したかったら、内側のforの直前にcout << pos.sfen() << endl;と追加して。

void book2sfen()
{
is_ready();

vector<string> my_book;
if (read_all_lines("book/book.sfen", my_book))
cout << "read book error!" << endl;

Position pos;
StateInfo si[1024 /* 最大手数 */];

for(auto sfen : my_book)
{
pos.set_hirate(si,Threads.main());
auto sfen_tokens = split(sfen ,' ');

for(int i=2 /* "startpos moves"を読み飛ばす*/; i < sfen_tokens.size(); ++i)
{
auto move = move_from_usi(pos , sfen_tokens[i]);
if (!is_ok(move))
break; // 非合法手 エラーにすべき

pos.do_move(move,si[i]);

// 局面のsfen出力
cout << pos.sfen() << endl;
}
}
}