Это не очень элегантно, но вы можете использовать какой-то трюк с перенаправлением, чтобы поймать количество байтов, скопированных dd, а затем использовать его как условие выхода для цикла while:
while [ -z "$byte_copied" ] || [ "$byte_copied" -ne 0 ]; do
sleep $X;
byte_copied=$(dd bs=$Y count=1 2>&1 >&4 | awk '$2 == "byte"{print $1}');
done 4>&1
Однако, если вы намерены ограничить пропускную способность передачи, я предлагаю вам использовать pv.