Как сделать в Go, чтобы какая-то goroutine выполнялась циклично до тех пор, пока state не станет false?
В вашей реализации надпись "I am doing this!" будет показана только один раз, т.к. вы пишите всего 1 раз в канал, а потом выполнение заблокируется на чтении данных из канала, т.к. там данных не будет.

То, что вы хотите сделать можно сделать вот так:
package main

import (
    "log"
    "time"
)

func doSomethingEvery5Seconds(ch chan bool) {
    log.Println("Started!")
    for {
        select {
        case <-ch:
            return
        default:
            log.Println("I am doing this!")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    ch := make(chan bool, 1)
    go doSomethingEvery5Seconds(ch)
    time.Sleep(15 * time.Second)
    close(ch) // Останавливаем спустя 15 секунд
}
Вот пример работы с маятником:
https://gobyexample.com/tickers
Похоже на то как указал Евгений Мамонов , но вместо time.Sleep(1 * time.Second) значения берутся из канала маятника, которые будут блокироваться на указанное время.